1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
while ($line=<DAT>) { &parse_csv1 ($line); push @record,@fields; } print $record[2];#nur der text buchungstage jedes "wort" jede zahl einzel mit index anzusprechen. close(DAT); sub parse_csv1 { $line = shift; @fields=(); while ($line =~ m{ ( [^"';] + ) | "((?: [^"] | "") * ) "}gx) { if (defined $1) { $field = $1; } else { ($field = $2) =~ s/""/"/g;#??????????? } push @fields, $field; } print $fields[1]; # Text:Buchungstage und alle Datumangaben return (@fields); }
# dein perl code hier
1
2
"Auftragskonto";"Buchungstag";"Valutadatum";"Buchungstext";"Verwendungszweck";"Beguenstigter/Zahlungspflichtiger";"Kontonummer";"BLZ";"Betrag";"Waehrung";"Info"
"0000000544";"12.02";"14.02.14";"FOLGELASTSCHRIFT"
"Text mit einem Semikolon "";"" drin"; und; noch; weitere; spalten
2014-02-17T20:24:24 topegHier Split zu verwenden ist keine so gute Idee.
was passiert wenn man so was stehen hat:
Code: (dl )"Text mit einem Semikolon "";"" drin"; und; noch; weitere; spalten
split(/;/,$line) würde hier die erste Spalte zerlegen, obwohl das Semikolon in einem Quote steht.
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
use strict; use warnings; #... # ich hoffe du öffnest Dateien der Art: open(my $fh, '<:encoding(UTF-8)', $file) or die("Err $file $!"); #... # Matrix der gelesenen Daten my @record; while ($line=<$fh>) { my @fields=parse_csv1($line); push( @record,\@fields ); } print $record[2][1]."\n";#nur der text buchungstage jedes "wort" jede zahl einzel mit index anzusprechen. close($fh); sub parse_csv1 { my $line = shift; my @fields; # falls die Zeile noch Daten enthält while(length($line)) { # sich durch den String hangeln # eine CSV-Zeile beginnt mit # einem Quotezeichen ' " ' # oder einem zeichen dfas nicht ',' ist if($line=~s/^\s*"//s) { # wir befinden uns innerhalb eines Quotes # es wird solange gelesen bis wir auf ein einzelnes ' " ' stoßen: my $value=''; while($line=~s/^([^"]*)"//s) { $value.=$1; if($line=~s/^"//s) { # ' "" ' gefunden, immer noch innerhalb des Quotes $value.='"'; } else { # einzelnes ' " ' gefunden, Quote verlassen last; } } # gelesene Spalte in das Array push(@fields,$value); # mögliches Komma entfernen: $line=~s/^\s*,//s; } elsif($line=~s/^\s*([^,]+)\s*//s) { # wir haben eine Spalte gelesen push(@fields,$1); # ein mögliches ',' entfernen $line=~s/^\s*,//s; } else { die(qq(Zeile "$line" nicht parsen!\n)); } # mögliches Zeilenende entfernen: $line=~s/^\s+//s; } #Array zurück geben return (@fields); }