A voir également:
- Help script perl comparaison de deux fichiers
- Script vidéo youtube - Guide
- Explorateur de fichiers - Guide
- Fusionner deux fichiers excel - Guide
- Wetransfer gratuit fichiers lourd - Guide
- Deux ecran pc - Guide
2 réponses
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 099
Modifié par [Dal] le 12/03/2012 à 15:09
Modifié par [Dal] le 12/03/2012 à 15:09
Salut nosuperman,
Voilà des pistes :-)
Avec le premier fichier, tu mets dans un hash les données à partir de la 2ème ligne, avec les données de la colonne 1 ("sb001", etc.) en tant que clef et le reste de la ligne en tant que valeur.
Tu utilises une expression rationnelle telle que celle qui suit pour capturer d'une part les données contenues dans ta 1ère colonne et d'autre part le reste de la ligne.
Avec le 2ème fichier, tu vérifies si la donnée de la 1ère colonne correspond à une clef existante :
- si oui, tu modifies le contenu de la valeur qui lui est affectée en concaténant la valeur existante avec le reste de la ligne nouvellement capturée séparé par un espace ;
- si non, tu crées une nouvelle clef pour la donnée de la 1ère colonne nouvellement capturée avec le reste de la ligne nouvellement capturé en tant que valeur, avec des tirets devant.
Tu fais une itération sur le hash pour vérifier ceux qui n'ont pas été complétés, et tu ajoutes des tirets à la suite. Par exemple, en traitant les valeurs de hash qui ne correspondent pas à l'expression suivante représentant une ligne complétée :
Puis tu affiches ta 1ère ligne et tu fais une itération sur le hash en le triant par ordre alphabétique des clefs, pour afficher clefs et valeurs.
Bon courage.
Dal
Voilà des pistes :-)
Avec le premier fichier, tu mets dans un hash les données à partir de la 2ème ligne, avec les données de la colonne 1 ("sb001", etc.) en tant que clef et le reste de la ligne en tant que valeur.
Tu utilises une expression rationnelle telle que celle qui suit pour capturer d'une part les données contenues dans ta 1ère colonne et d'autre part le reste de la ligne.
(^sb[0-9]+) (.*)$
Avec le 2ème fichier, tu vérifies si la donnée de la 1ère colonne correspond à une clef existante :
- si oui, tu modifies le contenu de la valeur qui lui est affectée en concaténant la valeur existante avec le reste de la ligne nouvellement capturée séparé par un espace ;
- si non, tu crées une nouvelle clef pour la donnée de la 1ère colonne nouvellement capturée avec le reste de la ligne nouvellement capturé en tant que valeur, avec des tirets devant.
Tu fais une itération sur le hash pour vérifier ceux qui n'ont pas été complétés, et tu ajoutes des tirets à la suite. Par exemple, en traitant les valeurs de hash qui ne correspondent pas à l'expression suivante représentant une ligne complétée :
(^sb[0-9]+) (.*) (.*) (.*) (.*) (.*) (.*) (.*)$
Puis tu affiches ta 1ère ligne et tu fais une itération sur le hash en le triant par ordre alphabétique des clefs, pour afficher clefs et valeurs.
Bon courage.
Dal
merci vraiment je ne connais pas trop la syntaxe pour le hash mais je vais chercher parce que lu on dirai que c'est facil lol :) j'espere que ca va marcher
Facebook: (supprimé par la modération)
Facebook: (supprimé par la modération)
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 099
Modifié par [Dal] le 12/03/2012 à 15:47
Modifié par [Dal] le 12/03/2012 à 15:47
Re,
avec https://www.google.com/search?q=perl+hash&gws_rd=ssl
tu as dans les 2 premiers résultats des exemples te permettant d'initialiser un hash, d'y ajouter des éléments, de faire des itérations dans un hash, de classer alphabétiquement par ordre de clefs, etc.
Oui, c'est facile :-)
Dal
avec https://www.google.com/search?q=perl+hash&gws_rd=ssl
tu as dans les 2 premiers résultats des exemples te permettant d'initialiser un hash, d'y ajouter des éléments, de faire des itérations dans un hash, de classer alphabétiquement par ordre de clefs, etc.
Oui, c'est facile :-)
Dal
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 099
Modifié par [Dal] le 12/03/2012 à 19:29
Modifié par [Dal] le 12/03/2012 à 19:29
Salut,
Bravo !
Par contre, est-qu'il n'y a pas une incohérence dans ton exemple que je n'avais pas vue ?
Dans ton exemple
et tu dis que dans
C'est donc qu'il y a bien 2 "jaques" dans le résultat en fic 3.
Si ton problème est que, pour la colonne "jaques", ton exemple ne correspond pas et tu dois compléter les valeurs éventuellement manquantes par ce qu'il y a en fic 1 ou en fic 2 et fusionner cette colonne en une, il faut faire un peu différemment en capturant les données propres à cette colonne et en introduisant ces tests dans ton programme.
En étendant la regexp que je t'ai donnée tout à l'heure comme cela :
tu as en capture 4 le "jaques" du fic 1 et en capture 8 le "jaques" du fic 2.
A toi de jouer :-)
Dal
N.B. : normalement, il y a un "c" à "Jacques", mais c'est un détail sans impact sur ton programme probablement ;-)
Bravo !
Par contre, est-qu'il n'y a pas une incohérence dans ton exemple que je n'avais pas vue ?
Dans ton exemple
fic1 : test robert anna jaques cyril sb002 aa cc bb uu
fic 2 : test anais roberta jaques nicolas sb002 aa cc -- uu
et tu dis que dans
fic 3 : sb002 aa cc bb uu aa cc -- uu
C'est donc qu'il y a bien 2 "jaques" dans le résultat en fic 3.
Si ton problème est que, pour la colonne "jaques", ton exemple ne correspond pas et tu dois compléter les valeurs éventuellement manquantes par ce qu'il y a en fic 1 ou en fic 2 et fusionner cette colonne en une, il faut faire un peu différemment en capturant les données propres à cette colonne et en introduisant ces tests dans ton programme.
En étendant la regexp que je t'ai donnée tout à l'heure comme cela :
(^sb[0-9]+) (.*) (.*) (.*) (.*) (.*) (.*) (.*) (.*)$
tu as en capture 4 le "jaques" du fic 1 et en capture 8 le "jaques" du fic 2.
A toi de jouer :-)
Dal
N.B. : normalement, il y a un "c" à "Jacques", mais c'est un détail sans impact sur ton programme probablement ;-)