Thread Keywords in Textdateien zählen
(9 answers)
Opened by Nik at 2016-04-20 01:53
"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: 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. 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: Code: (dl
)
1 Personalnummer: 0123456789 Code: (dl
)
1 Personalnummer: 9876543210 Output: Code: (dl
)
1 Personalnummer;uebertroffen;erreicht;motiviert;sehr motiviert 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! |