Hello,
Après des heures d'essais, je donne ma langue au chat. J'essaie de charger une liste de fichiers csv. Chaque ligne est stockée dans une table de hachage ayant comme clé, le nom de la colonne d'entête.
Ensuite je stocke chacun de ces hash dans un tableau ce qui me représente un fichier. J'ai donc un tableau de table de hachage par fichier.
Je fini par stocker ces fichiers dans une table de hachage ayant comme clé le nom du fichier et comme valeur mon tableau de table de hash.
Le remplissage semble se passer correctement car si à la fin de ceci je fais un :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 my $filedir = "/export/home/lls/files"; my %files; $evalerror="NoError"; eval{ $SIG{__WARN__} = sub { $evalerror= join (":", @_) . "\n"; }; opendir(DIR,"$filedir"); my @filenames = readdir(DIR); foreach $file (@filenames){ next if ($file=~ /^\.+$/); # We skip . and .. open (FILE,"$filedir/$file"); $file=~ s/\..*//; #We remove the extension my $fileline = 0; my @headers = (); my @filedata = (); my $rowsize; while (<FILE>){ my %rowdata; my @row; if ($fileline == 0){ @headers = split(/;/,$_); $rowsize = @headers; }else { @row = split(/;/,$_); for (my $i = 0; $i < $rowsize; $i++){ $rowdata{$headers[$i]} = $row[$i]; } push @filedata, {%rowdata}; } $fileline++; } $files{$file} = [@filedata]; } };
Il m'affiche bien la troisième colonne de la 3eme ligne du fichier 1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part print $files{fichier1}[2]{colonne3}
Sauf que maintenant j'ai besoin de parcourir cette structure. J'essaye par exemple :
cela ne fonctionne pas. Il semblerait que mes @valorsinposition et @valors soient des tableaux de tableaux de hash :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 @valorsinposition = $files{ValorPosition}; @valors = $files{Valor}; foreach $valorinposition (@valorsinposition){ my $valorfound = 0; foreach $valor (@valors){ if ($valorinposition{valorId} eq $valor{Id}){ $valorfound = 1; last; } } if (not $valorfound){ print "Valorposition $valorinposition{valorId} not found in table Valor !\n"; } }
DB<15> p @valors --->ARRAY(0x4d2978)
DB<16> p $valors[0] --->ARRAY(0x4d2978)
DB<17> p $valors[0][0] --->HASH(0x500fdc)
Je suis persuadé que j'ai dû faire une bêtise ... mais là .. je sèche.
Si quelqu'un a une once d'idée, j'en serai ravis
Thanks
Hy00ga
Partager