Thread CSV Datei als Hash aufbauen (4 answers)
Opened by PETER_PAN2009 at 2011-04-19 16:58

rosti
 2011-04-19 17:17
#147861 #147861
User since
2011-03-19
3218 Artikel
BenutzerIn
[Homepage]
user image
Edit:

Sorry, vorhin war ich nicht ganz bei der Sache... also Du brauchst einen Helper, der aus der ersten Zeile heraus, die Zuordnung macht. Zum Testen habe ich die erste Zeile mal von Hand rausgenommen und den Helper erstellt. Die CSV ohne erste Zeile als DATA. Siehe Code

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
package Names;

###########################################################################
# Rolf Rost, 14.2.2011
# Anonyme Array-Elemente bekommen Namen
###########################################################################
use strict;

# Setzt ein Array in ein Objekt um
sub new{
  my $class = shift;
  my $maps  = shift; # {3 => 'Day', 4 => 'Month', 5 => 'Year'}
  my $aref  = shift; # array als referenz von localtime, stat, etc.
  return if ref $maps ne 'HASH';
  return if ref $aref ne 'ARRAY';
  my $self  = {};
  for(my $i = 0; $i < scalar(@$aref); $i++){
    $self->{$maps->{$i}} = $aref->[$i] if exists $maps->{$i};
  }

  return bless $self, $class;
}

package main;

use strict;
use warnings;
use Data::Dump qw(dump);

# Erste Zeile sei
my $z1 = "Name,Vorname,Alter";
my @header = split ",", $z1;
my $helper = {};
foreach my $i(0..$#header){
        $helper->{$i} = $header[$i];
}

#print dump $helper; # { "0" => "Name", 1 => "Vorname", 2 => "Alter" }

my $result = {};
my $i = 1; # Zeilennummer
while(my $line = <DATA>){
        chomp $line;
        my $o = Names->new($helper, [split ",", $line]);
        $result->{$i} = $o;
        $i++;
}

print dump $result;
#{
#  1 => bless({ Alter => 45, Name => "Meier", Vorname => "Hans" }, "Names"),
#  2   => bless({ Alter => 54, Name => "Hansel", Vorname => "Horst" }, "Names"),
#  3   => bless({ Alter => 33, Name => "Horst", Vorname => "Anna" }, "Names"),
#}


# CSV
__END__
Meier,Hans,45
Hansel,Horst,54
Horst,Anna,33







########################################################################
Bitte ignorieren
########################################################################
Quote
wie kriege ich es hin, dass der Key "Name" die Values "Meyer" und "Schmidt" zugeweisen bekommt?


mein erster Vorschlag wäre ein Array als Value, bzw. eine Referenz auf das Array:

Code (perl): (dl )
  $hash{Name} = ['Vorname','Alter'];


Rosti


Edit: Mein zweiter Vorschlag hängt davon ab, wie Dir mein Erster gefällt ;)
Last edited: 2011-04-19 20:06:26 +0200 (CEST)

View full thread CSV Datei als Hash aufbauen