Help script perl comparaison de deux fichiers

Fermé
Profil bloqué - 12 mars 2012 à 13:27
 Profil bloqué - 13 mars 2012 à 08:56
Bonjour,

je dois faire un script pour comparer deux fichier et je ne sais pas vraiment comment mi prendre..

fic1 du style

test robert anna jaques cyril
sb001 aa bb cc aa
sb002 aa cc bb uu
sb003 aa uu cc bb

fic 2 du style

test anais roberta jaques nicolas
sb002 aa cc -- uu
sb008 aa cc bb uu
sb009 aa cc bb uu

pour le -- c'est une donnée manquante

en faite je dois comparer les deux fichiers

en gros il doit ressortir un fichier3

comme celui la

test robert anna jaques cyril anais roberta nicolas
sb001 aa bb cc aa -- -- --
sb002 aa cc bb uu aa cc -- uu
sb003 aa uu cc bb -- -- --
sb008 -- -- bb -- aa cc uu
sb009 -- --bb -- aa cc uu

pour resumer le fichier 3
on fusionne les données redondante exemple pour jaques qui est dans les deux fichiers
et on fusionne les données pour les test redondant comme sb002 dans l'exemple

merci si vous avez des pistes pour m'aider je rames...
ouverture de fichier, lecture c'est bon c'est pour la comparaison et l'envoie sur un fichier3

A voir également:

2 réponses

[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
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.

(^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
0
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)
0
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
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
0
Profil bloqué
12 mars 2012 à 16:22
je suis arrivé a avoir le resultat presque voulu sauf que pour la ligne un je suis pas arrivé a fussioner dans le fichier m3 jaques du coup j'ai deux jaques pour les lignes sb par contre ca a super bien marché
0
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
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
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 ;-)
0
Profil bloqué
13 mars 2012 à 08:56
oui je me suis trompé
au final il faut que 7 colonnes de données vu que jaques doit fusionner ensemble
oui pour l'orthographe de jacques c'est pas important parce que je travail sur des alleles et des snp biologie
0