Thread Problem beim taggen einer Datei via zweiter Datei.
(6 answers)
Opened by efbe at 2008-06-02 22:19
Hier mein Vorschlag, um das beschriebene Problem zu lösen:
Der 1. Schritt liest die Liste der Verben ein, entfernt die Zeilenumbrüche und speichert die Verben als Hash-Keys mit undefinierten Values; Einen Hash-Key kann man einfacher auf Existenz prüfen als in einer Liste zu suchen, ob ein bestimmtes Element vorhanden ist. Der 2. Schritt liest die Datendatei ein und trennt jede Zeile an den Whitespaces (Leerzeichen, Newlines, Tabs, etc.). Dadurch spart man das explizite Entfernen des Newlines (was ohnehin nicht notwendig wäre). Als Stücke bleiben das Nomen, das Verb und die Anzahl übrig. Ist das Verb definiert, wird stillschweigend davon ausgegangen, dass die anderen Daten entsprechend korrekt sein sollten. Ist das Verb als Hash-Key vorhanden (und war somit in der Liste der Verben), wird die Ausgabe entsprechend erweitert; wenn nicht, wird die originale Zeile ausgegeben. Soll die Ausgabe wieder in eine Datei, kann man die Ausgabeumleitung nutzen: Code: (dl
)
$ perl skript.pl > ausgabe.txt Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 #!/usr/bin/perl # vi: set ts=4 sw=4 sts=2 et: use strict; use warnings; # Author: linuxer # Date: 02. June 2008 # Description: # http://board.perl-community.de/thread/11962/#MSG0 my %verb; # 1st step: read all verbs into a hash { my $verb_file = 'koroesi.txt'; open my $fh, '<', $verb_file or die "$verb_file: open(ro) failed: $!\n"; # store all verbs in array; my @verbs = <$fh>; # remove all newlines chomp @verbs; # store all verbs as hash keys @verb{@verbs} = (); close $fh or die "$verb_file: close(ro) failed: $!\n"; } # 2nd step: do the work { my $check_file = 'svc_test_sdl.txt'; open my $fh, '<', $check_file or die "$check_file: open(ro) failed: $!\n"; while ( my $line = <$fh> ) { # split at whitespace (beware: newlines are whitespaces, so no chomp needed) my ( $noun, $verb, $number ) = split /\s+/, $line; # if $verb is defined, assume all variables are correctly filled if ( defined $verb ) { # is $verb a key in hash %verb? if ( exists $verb{$verb} ) { # print the modified data printf "%s [%s] %s\n", $noun, $verb, $number; # oder ohne printf #print $noun, " [$verb] ", $number, "\n"; } # if not else { # print unmodified line print $line; } } } close $fh or die "$check_file: close(ro) failed: $!\n"; } __END__ meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |