IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Problème avec un hash de tableau de hash


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Par défaut Problème avec un hash de tableau de hash
    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.

    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];
        }
    };
    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
    print $files{fichier1}[2]{colonne3}
    Il m'affiche bien la troisième colonne de la 3eme ligne du fichier 1.

    Sauf que maintenant j'ai besoin de parcourir cette structure. J'essaye par exemple :

    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";
        }
    }
    cela ne fonctionne pas. Il semblerait que mes @valorsinposition et @valors soient des tableaux de tableaux de hash :

    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

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Par défaut
    Bon ... Ben j'ai résolu mon problème. Je suis pas certain d'être sûr du problème initial mais il me semble que c'était un soucis au niveau de la copie des éléments lors du foreach.

    J'ai tout passé en references et cette fois cela fonctionne

    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
    42
     
    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;
                chomp;
     
                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;
        }
    };
    et pour les foreachs :

    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
     
    my $valorsinposition = $files{ValorPosition};
    my $valors = $files{Valor};
     
    foreach $valorinposition (@$valorsinposition){
        my $valorfound = 0;
        foreach $valor (@$valors){
            if ($valorinposition->{valorID} eq $valor->{Id}){
                $valorfound = 1;
            }
        }
        if (not $valorfound){
            print "Valorposition $valorinposition->{Id} not found in table Valor !\n";
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 17
    Dernier message: 10/08/2011, 17h51
  2. Perl: problème avec un hashage de tableau
    Par lorlando dans le forum Langage
    Réponses: 1
    Dernier message: 24/04/2009, 09h44
  3. Problème de remplissage d'un tableau de hash
    Par witch dans le forum Langage
    Réponses: 15
    Dernier message: 10/06/2008, 13h45
  4. problème avec affichage d'un tableau
    Par bandit_debutant dans le forum Collection et Stream
    Réponses: 15
    Dernier message: 29/05/2008, 16h15
  5. Problème avec PtInRegion et un tableau dynamique
    Par mduse dans le forum Langage
    Réponses: 2
    Dernier message: 06/12/2005, 09h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo