Thread Problem beim taggen einer Datei via zweiter Datei. (6 answers)
Opened by efbe at 2008-06-02 22:19

Linuxer
 2008-06-02 22:49
#110649 #110649
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
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!

View full thread Problem beim taggen einer Datei via zweiter Datei.