Thread Datei nach Zeichen durchsuchen
(15 answers)
Opened by Emeto at 2011-07-01 18:09
Hi, willkommen zur 2. Halbzeit :)
Guest Emeto Das habe ich so verstanden, dass für jeden Namen Records mit verschiedenen Nummern auftreten können. Wenn es eine feste Zuordnung Name => Nummer gibt, brauchst Du kein Array der Nummern für jeden Namen, sondern nur einen Zähler. Das würde man dann anders schreiben ... Also: Diese Schleife Code (perl): (dl
)
1 2 3 4 5 6 while (<$in>) { my @tmp = split ','; # perldoc -f split my ($number, $name) = @tmp[0,2]; # perldata, Stichwort 'slice' next if ! defined $name; push @{$dump_packs{$name}}, $number ; # key: name, value: number array (!) } Guest Emeto Soweit ich sehe, ist in Data2.txt eine Art Liste, in der die "richtigen" Namen stehen. Du willst jetzt alle "falschen" Namen isolieren, die zwar in %dump_packs, aber nicht in Data2.txt auftauchen, richtig? Leider gibst Du kein Beispiel, wo in den Zeilen von Data2.txt die Namen stehen und Du verwendest einen Mustervergleich, der sehr oft aufgerufen werden muss (das ist "teuer"). Ohne weitere Information würde ich das so angehen: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 my $richtige; { local $/; # perldoc perlvar open(my $in2, '<', $boltons) or die $!; $richtige = <$in2>; # gesamte Datei in Skalar speichern close $in2; } open(my $out, '>', "$resdir/${dumpfile}_packs_notlist.txt") or die $!; for my $name (sort keys %dump_packs) { if ($richtige !~ /$name/) { print $out join(',', $name, @{$dump_packs{$name}}) . "\n"; } } close $out; Jetzt enthält Data1.txt_packs_notlist.txt zeilenweise: Name,Nummer_1,Nummer_2 .. Nummer_n EDIT: Die Suchschleife findet das Vorkommen von $name irgendwo in der Datei, das entspricht Deinem Vorgehen, nur halt nicht zeilenweise. Du bekommst Probleme, wenn $name auch an Stellen auftaucht, an denen es nicht als Name gemeint ist (falschpositive Treffer): name1,bla,foo,iuwefxhm name2,x,123,xyzname3uefgh name4,3786,92zr,keuwhf Beachte den Block { ... } um die Einleseroutine. Innerhalb des Blocks wird $/ als "local" deklariert und nicht initialisiert (undef). Lies dazu mal perlvar in der Doku. Ich hoffe, ich habe einigermaße getroffen, was Du meintest. Du solltest Dir unbedingt einen konsistenteren Programmierstil angewöhnen, Deine Verwendung der Variablen ist manchmal konfus :) Eine Zeile wie Code (perl): (dl
)
open (my $in2, '<', $boltons) or die "Could not open $dumpfile: $!\n"; Viel Spaß noch mit Perl! Gruß FIFO P.S.: Ohne Beispieldaten kann ich das natürlich nicht testen. Last edited: 2011-07-06 08:44:55 +0200 (CEST) Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
|