Parcours de deux fichier

Fermé
saf92 Messages postés 3 Date d'inscription lundi 23 mars 2015 Statut Membre Dernière intervention 23 mars 2015 - Modifié par blux le 23/03/2015 à 12:58
saf92 Messages postés 3 Date d'inscription lundi 23 mars 2015 Statut Membre Dernière intervention 23 mars 2015 - 23 mars 2015 à 18:45
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 26013 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 3 289
Modifié par blux le 23/03/2015 à 13:04
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 lundi 23 mars 2015 Statut Membre Dernière intervention 23 mars 2015
23 mars 2015 à 13:04
les id des fichiers sont bien triés , et il y a pas des id multiple dans les fichiers
0
blux Messages postés 26013 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 3 289
Modifié par blux le 23/03/2015 à 13:53
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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 23/03/2015 à 17:06
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 26013 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 3 289
23 mars 2015 à 18:06
En espérant que ça tienne en RAM ;-)
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 23/03/2015 à 18:38
:-) 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 lundi 23 mars 2015 Statut Membre Dernière intervention 23 mars 2015
23 mars 2015 à 18:45
merci à vous ,mais je suis encore débutante en programmation perl je v essayé de chercher à implémenter une version avec le hash .
0