#!/usr/bin/perl # 'datasum.pl' dient der Summierung von Daten aus einer CSV-Datei (comma separated values). # use Getopt::Long; # Initialisierung der Variablen für Kommandozeilen-Argumente my @key = (); my $data = ''; my $count = ''; my $delimiter = ';'; # Stand-Feldtrenner ist ';' # Initialisierung sonstiger Variablen my $ERRFLAG = 0; my %hashtable = (); my $idx = (); &GetOptions ("key=s", "data:s", "count", "delimiter:s", "help"); if ( $opt_help ) { &usage; exit 0; } if ( !$opt_key ) { print "Option '--key=n[,n...]' ist zwingend erforderlich!\n"; $ERRFLAG = 1; } else { @key = split(/,/, $opt_key); } if ( !$opt_data && !$opt_count ) { print "Option '--data=n' oder '--count' ist zwingend erforderlich!\n"; $ERRFLAG = 1; } if ( $opt_data ) { $data = $opt_data; if ( $opt_count ) { print "Option '--data=n' und '--count' zusammen nicht sinnvoll!\n"; $ERRFLAG = 1; } } if ( $opt_count ) { $count = 1; } if ( $opt_delimiter ) { $delimiter = $opt_delimiter; } if ( $ERRFLAG ) { &usage; exit 1; } # Feldindizes auf Perl-Standard (beginnend mit 0) korrigieren foreach $idx (@key) { $idx--; } if ($opt_data) { $data--; } while (<>) { chop; @field = split("\Q$delimiter\E"); $schluessel = (); foreach $idx (@key) { if ( !$schluessel ) { $schluessel = $field[$idx]; } else { $schluessel = $schluessel . "$delimiter" . $field[$idx]; } } if ( $opt_data ) { if (exists($hashtable{$schluessel})) { $hashtable{$schluessel} += $field[$data]; } else { $hashtable{$schluessel} = $field[$data]; } } else { if (exists($hashtable{$schluessel})) { $hashtable{$schluessel} += 1; } else { $hashtable{$schluessel} = 1; } } } foreach $entry (keys %hashtable) { print $entry, $delimiter, $hashtable{$entry}, "\n"; } sub usage () { print "usage: $0 --help\n"; print " $0 --key=n[,n...] --count [--delimiter=c] [filename]\n"; print " $0 --key=n[,n...] --data=n [--delimiter=c] [filename]\n"; print " Optionen:\n"; print " --key=n Angabe von ein oder mehreren Schlüsselfeldern\n"; print " --count Häufigkeit der Schlüsselwerte zählen (anstatt --data=n)\n"; print " --data=n Feld dessen Inhalt summiert werden soll\n"; print " --delimiter=c Feldtrennzeichen\n"; }