Thread Problem mit Rückgabewert eine Sub (12 answers)
Opened by Ingo75 at 2014-02-17 17:55

topeg
 2014-02-17 21:19
#173618 #173618
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
So kann man es machen:
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
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);
}


Aber es ist wirklich besser Text::CSV zu benutzen. Der Code oben Überspringt noch einige Sachen wie mehrzeilige Quotes und andere Formen der Entwertung von ' " ' und ' , '. Auch werden Falsch formatierte Spalten fehlinterpretiert.

View full thread Problem mit Rückgabewert eine Sub