Parcours de deux fichier

saf92 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
saf92 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -
bonjour, je suis débutante en programmation perl et je voudrait parcourir 2 fichiers et enregistrer les lignes des deux fichier qui ont le même id dans un autre fichier.
par exemple fichier result_fr:
3: aaaaaaaaa
4:BBBBBBB
et fichier result_en:
1 :ffffffff
2:kkkkkk
3:lllllllll
4:mmmmm
le fichier resulat_final doit afficher
3:aaaaaaaaa lllllllll
4:BBBBBBB mmmmm
voici mon script:
my $filename = "C:\\Perl\\bin\\result_fr.txt";
my $filename1 = "C:\\Perl\\bin\\result_en.txt";
my $filename2 = "C:\\Perl\\bin\\ress_final.txt";
open(my $fh, '<' , $filename) or die "Erreur" ;
open(my $fh1, '<' , $filename1) or die "Erreur" ;
open(my $fh2, '>>' , $filename2) or die "Erreur" ;
while (my $line = <$fh>)
{
while (my $line1=<$fh1>)
{
my @T1=split(/ / , $line);
my @T2=split(/ / , $line1);
if ($T1[0] eq $T2[0])
{
print  $fh2 $line $line1,"\n";
}
}
}
print "ok ";

mon script exécute mais affiche seulement la résultat d'un seul parcours. Merci de m'aider
A voir également:

3 réponses

blux Messages postés 27121 Date d'inscription   Statut Modérateur Dernière intervention   3 359
 
Salut,

deux questions :

- tes fichiers sont-ils bien triés ?
- as-tu des id multiples dans l'un ou l'autre des fichiers ?

De plus, mais on verra après, tes while s'exécutent de manière inconditionnelle (à part la fin de fichier)...

A+ blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
0
saf92 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
les id des fichiers sont bien triés , et il y a pas des id multiple dans les fichiers
0
blux Messages postés 27121 Date d'inscription   Statut Modérateur Dernière intervention   3 359
 
C'est compliqué parce que tu ne reviens jamais au début de $fh1.

Ex :

je lis $fh et $fh1, j'extrais les clés, elles ne sont pas identiques, je lis $fh1. Je les trouve identiques, j'écris $fh2 et je continue à lire $fh1 jusqu'à la fin, donc aucune chance de retrouver quelque chose identique dans $fh.

Ensuite, quand je suis à la fin de $fh1, je lis un autre $fh et comme $fh1 est à la fin, mon while se termine tout de suite...

Il faut soit fermer $fh1 quand tu as trouvé des id communs (mais sur de gros fichiers, ça fait un produit cartésien, donc très long), soit opter pour un algorithme de type 'appairage de fichiers' avec tests de grandeurs entre les clés pour savoir lequel on doit faire progresser en lecture pour rattraper (éventuellement l'autre).

A+ blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut saf92,

Tu charges le premier fichier et tu parcours chaque ligne, en utilisant l'identificateur comme clef d'un hash et le contenu qui suit comme valeur du hash, jusqu'à la fin de ce fichier (utilise une regexp pour séparer les deux).

Après avoir fait cela, tu parcours le second fichier ligne par ligne aussi, et en appliquant la même regexp, tu testes si l'identificateur correspond à une clef existante de ton hash, si oui, tu concatènes à la valeur existante la nouvelle valeur, jusqu'à la fin de ce fichier.

Puis tu affiches ton hash, éventuellement en le triant selon la clef, si cela a un sens pour toi.

Dal
0
blux Messages postés 27121 Date d'inscription   Statut Modérateur Dernière intervention   3 359
 
En espérant que ça tienne en RAM ;-)
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
:-) oui, bien sûr, mais il ne faut pas exagérer non plus car on peut utiliser une seule structure de données : le hash où les résultats sont consignés, les deux fichiers n'étant pas slurpés en mémoire, mais lus ligne par ligne.

Si le hash ne tient pas en mémoire, je ne vois pas trop comment il va faire le recoupement des "id" avec le second fichier dans son script Perl.

Peut être en ligne de commande à coups de grep, de sed et d'echo... mais il va falloir avoir du temps, car cela ne va pas optimiser du tout les accès au disque.

Dal

Edit :
P.S. : je comprend maintenant ta remarque, j'avais écrit "Tu charges le premier fichier et tu parcours chaque ligne", en fait j'aurais dû écrire "Tu ouvres le premier fichier et tu parcours chaque ligne"
0
saf92 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
merci à vous ,mais je suis encore débutante en programmation perl je v essayé de chercher à implémenter une version avec le hash .
0