Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Invité de passage
    Inscrit en
    novembre 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : novembre 2012
    Messages : 9
    Points : 4
    Points
    4

    Par défaut Fusion de tableaux

    Bonjour,
    Je dispose d'un répertoire avec une centaine de fichiers de ce type :

    ID Chemin_acces_du_fichier
    1 1.2
    2 5.2
    3 1.3
    4 2.3
    ... ...
    2000 2.6

    La colonne ID est présente dans tous les fichiers. Le but est d'obtenir un unique tableau de ce type :
    Code :
    1
    2
    3
    4
    5
    6
    7
    ID        Nom_du_fichier_1  Nom_du_fichier_2   ...  Nom_du_fichier_100   
    1          1.2                         2.3     ...  1.3   
    2          5.2                         1.2     ...  2.5   
    3          1.3                         0.9     ...  0.1   
    4          2.3                         8.6     ...  7.0   
    ...        ...                         ...     ...  ...   
    2000       2.6                         1.2     ...  4.6
    Voici le code que j'ai pour le moment :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    open fichier, ">c:/data.xls";
    my $i=0;
    my $rep = "C:/Donnees";
    opendir(REP,$rep) or die "Dossier introuvable";
    while(defined(my $fic=readdir REP)){ 
    	my $f="${rep}/$fic";
    	open FIC, "$f" or warn "$f fichier introuvable";
    	$i=$i+1;	
      while(<FIC>){
    	chomp($_);
    	my @Tab=split("\t", $_);
    	$a = "$Tab[1]\n";
    	$T[$i]=($a);
    	print fichier @T;
    	}	
      }
    closedir(REP);
    J'obtiens une colonne des valeur du fichier 1, suivi de celles du fichier 2 etc...
    Je pense que la fonction pourrait m'aider mais je n'arrive pas à l'utiliser dans ce cas car je ne suis pas très à l'aise avec son utilisation.

    Si quelqu'un peut m'aider à débloquer ma situation je lui serai très reconnaissant
    D'avance merci !

  2. #2
    Membre régulier Avatar de elvivo
    Inscrit en
    mai 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : mai 2002
    Messages : 105
    Points : 80
    Points
    80

    Par défaut

    Pour chaque fichier tu devrais:
    1. creer une array pour sotcker le chemin complet de chaque fichier que tu lis. Normalement ils sont uniques.
    2. creer un hash de hash avec pour cle de premier niveau le champ id de chaque ligne et comme cle de secon niveau le chemin complet de chaque fichier. La valeur a stocker dans la feuille de l'arbre est la valeur du champ Chemin_acces_du_fichier
    3. print le contenu de l'array cree en 1 dans l'ordre que tu veux pour avoir ton header en separant chaque valeur par le separateur de ton choix (on dirait que tu utilises des tab?)
    4. boucle sur les cles du hash cree en 2. Pour chaque sous hash, parcours l'array en 1 dans le meme ordre qu'en 3 et affiche la valeur ou '' avec le separateur de ton choix (tu prefereras sans doute stocker les valeurs ordonnees dans une array intermediare et print join l'array)

    Avec ca ca devrait marcher.
    In code we trust !!

  3. #3
    Expert Confirmé

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 385
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2012
    Messages : 1 385
    Points : 3 299
    Points
    3 299
    Billets dans le blog
    1

    Par défaut

    Si les numéros de fichiers et les ID sont toujours numériques, un tableau de tableaux devrait faire l'affaire, avec quelque chose comme cela (en supposant que les fichiers sont dans le répertoire relatif "./chemin"):

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    use Data::Dumper;
    my @file_list = glob ("chemin/*.*");
    chomp @file_list;
    my $file_nr = 0;
    my @summary;
    foreach my $file (@file_list) {
         open "$fh", "<", $file or die "ouverture impossible de $file $! \n";
         $file_nr ++;
         while (<$fh>) {
              chomp;
              my ($id, $val) = split;
              $summary[$file_nr][$id] = $val;
         }
         close $fh;
    }
    print Dumper \@summary;
    Si tu préfères vraiment utiliser la fonction push, tu peux faire un truc dans ce genre:

    Code :
    1
    2
    3
    4
    5
         while (<$fh>) {
              chomp;
              my ($id, $val) = split;
              push @{$summary[$file_number]}, $val;
         }
    mais cette solution est beaucoup moins sûre, parce qu'elle n'utilise pas l'ID, donc il faut garantir que tous les fichiers ont bien tous les ID, sans saut de séquence (sans ID manquant). De plus les indices du tableau interne iront de 0 à n-1, au lieu des ID de 1 à n. Bref, pour moi, la première syntaxe est bien meilleure, car elle assure un meilleur contrôle du résultat.
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •