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
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
A voir également:
- Parcours de deux fichier
- Fichier rar - Guide
- Fichier host - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier iso - Guide
3 réponses
blux
Messages postés
26490
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
18 novembre 2024
3 316
Modifié par blux le 23/03/2015 à 13:04
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
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"
blux
Messages postés
26490
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
18 novembre 2024
3 316
Modifié par blux le 23/03/2015 à 13:53
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
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"
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié par [Dal] le 23/03/2015 à 17:06
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
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
blux
Messages postés
26490
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
18 novembre 2024
3 316
23 mars 2015 à 18:06
23 mars 2015 à 18:06
En espérant que ça tienne en RAM ;-)
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié par [Dal] le 23/03/2015 à 18:38
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"
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"
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
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 .
23 mars 2015 à 13:04