Thread Keywords in Textdateien zählen (9 answers)
Opened by Nik at 2016-04-20 01:53

Linuxer
 2016-04-21 00:33
#184524 #184524
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
"Keywords", die aus mehreren Wörtern bestehen, kannst Du so nicht direkt innerhalb von qw() definieren.

Aber die Keywords dürften doch übergreifend die gleichen sein, oder nicht?
Dann könnte man die Keywords in eine Datei schreiben und diese dann zu Beginn einlesen; ein "Keyword" pro Zeile:

keywords.txt (371b):

Code: (dl )
1
2
3
4
uebertroffen
erreicht
motiviert
sehr motiviert



Das Ausgabeformat hängt davon ab, wie Du es programmierst; lässt sich also sicher festlegen.

Hier ein Skript, dass auf dem Beispiel von wer basiert und modifiziert wurde. Die Ausgabe wurde in eine eigene Subroutine ausgelagert.

script.pl (15.7kb):

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#! /usr/bin/env perl
use strict;
use warnings;
use 5.012;

# Datei der Stichworte (1 pro Zeile) wird als Argument uebergeben
my $FILE_KEYWORDS = shift(@ARGV) || die "Keine Stichwort-Datei angegeben.\n";

# Dateien der Mitarbeiter werden aus aktuellem Verzeichnis gelesen
my @FILES = glob( 'id*.txt' );



#> sub routines
#> --------------------------------------------------------------------------

# lese Stichwort-Datei und liefere Liste der Stichworte
sub read_keywords {
    my $fname = shift;

    open( my $fh, '<', $fname ) or die "open($fname) fehlgeschlagen: $!";

    my @kw = <$fh>;
    chomp @kw;

    close $fh;

    return @kw;
}

sub join_for_regex {
   return join( '|',
     map { qr/\Q$_\E/ }
       # Sortierung und Reihenfolge ist wichtig!
       sort { length($b) <=> length($a) }
         @_
    );
}

# nur einfache Daten, also bauen wir eine einfache CSV-Ausgabe
# bei komplexeren Daten sollte ein Text::CSV Modul aus CPAN
# installiert und verwendet werden
sub print_csv {
    say join ';', @_;
}



#> main program
#> --------------------------------------------------------------------------

my @keywords = read_keywords($FILE_KEYWORDS);
my $regexp   = join_for_regex( @keywords );

# CSV Kopfzeile ausgeben
print_csv( 'Personalnummer', @keywords );


FILE:
for my $datafile ( @FILES ) {

    my $fh;
    # Wenn Datei nicht lesbar, Warnung geben und weiter mit naechster Datei
    if ( ! open $fh, '<', $datafile ) {
        warn "open($datafile) fehlgeschlagen: $!";
        next FILE;
    }

    # initialisiere die Zaehler der Stichworte mit 0 (Null)
    my %result = map { $_ => 0 } @keywords;

    # zeilenweise einlesen
    while ( my $line = <$fh> ) {

        if ( $line =~ m/Personalnummer: (\d+)/ ) {
            $result{id} = $1;
        }

        else {
            # Vorkommen der Stichworte hochzaehlen
            while ( $line =~ m/($regexp)/ig ) {
                $result{$1}++;
            }
        }
    }

    close $fh;

    # CSV Datenzeile ausgeben; pro Mitarbeiter/Datendatei
    print_csv( @result{ 'id', @keywords } );

}


__END__



Datendateien:
id0123456789.txt (492b):

Code: (dl )
1
2
3
4
Personalnummer: 0123456789
Der Angestellte hat die gesetzten Ziele uebertroffen und war auch sonst stets
motiviert.
Bisweilen haben wir ihn auch sehr motiviert erlebt.



id9876543210.txt (408b):

Code: (dl )
1
2
3
Personalnummer: 9876543210

Der Mitarbeiter war stets bemueht sehr motiviert zu erscheinen.




Output:
perl script.pl stichworte.txt (416b):

Code: (dl )
1
2
3
Personalnummer;uebertroffen;erreicht;motiviert;sehr motiviert
0123456789;1;0;1;1
9876543210;0;0;0;1

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 Keywords in Textdateien zählen