Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Langage
Langage Toutes vos questions sur les scripts Perl en général. Avant de poster, veuillez consulter les FAQs perl, les cours Perl, les critiques de livres et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/11/2012, 19h30   #1
Glacealeau
Invité de passage
 
Inscription : novembre 2012
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2012
Messages : 7
Points : 3
Points : 3
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 !
Glacealeau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 07h16   #2
elvivo
Membre régulier
 
Avatar de elvivo
 
Inscription : mai 2002
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 105
Points : 71
Points : 71
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 !!
elvivo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 11h50   #3
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 570
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 : 570
Points : 1 121
Points : 1 121
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.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h12.


 
 
 
 
Partenaires

Hébergement Web