Thread Datei nach Zeichen durchsuchen (15 answers)
Opened by Emeto at 2011-07-01 18:09

FIFO
 2011-07-06 00:17
#150177 #150177
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Hi, willkommen zur 2. Halbzeit :)

Guest Emeto
Die Idee das Skript ist eine Datei zu lesen, und die Namen und die Nummer von den Records zu finden. Danach brauche ich eine separarte Datei mit den Namen und der Häufigkeit.

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 (!)
}
liefert Dir in den keys von %dump_packs die Namen.

Guest Emeto
Danach soll ich die Namen von Datei1 mit einer Liste mit allen richtigen Namen vergleichen und diese Namen und dazugehörige Nummer in einem neuen Error- Datei schreiben, die NICHT in der Liste sind, aber in Datei1 auftauchen. Diese Namen sind falsch.

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";
zum Beispiel bringt Dich im Fehlerfall nicht wirklich weiter :)

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"

View full thread Datei nach Zeichen durchsuchen