Traitement de fichier [Fermé]

Signaler
-
Messages postés
5550
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
12 mai 2021
-
bonjour tous le monde
j'ai un fichier.txt qui contien mes sequence d'ADN , je voudrais faire un programme en perl pour me traiter les séquences dans mon fichier mais j'arrive bien à ouvrir le fichir en mode lecture , ce que je veux c'est comment déclarer ma variable qui contient 1000 séquences puis manipuler chaque sequence , merci d'avance

5 réponses

Messages postés
5550
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
12 mai 2021
933
Salut abdou3058,

Le mieux c'est que tu donnes un exemple de ce que contient le fichier et de ce que tu veux en faire, et que tu montres le code de ce que tu as déjà fait.


Dal
bonsoir ; je voudrai en faite faire une table de hash entre la premiere et la derniere colonne , pour ensuite classer les valeurs de derniere colonne par ordre décroissant et prendre les 5 meilleurs résultats et à la fin afficher les 5 lignes correspondantes aux meilleurs valeurs de score (la derniere colonne )





clone1_deb chu:CHU_0158 71.16 267 77 0 2 802 545 811 5e-108 392
clone1_deb chu:CHU_0158 100.00 10 0 0 810 839 821 830 5e-108 24.3
clone1_deb chu:CHU_0158 32.76 116 71 1 221 547 18 133 1e-09 66.6
clone1_deb chu:CHU_0158 40.74 54 31 1 8 166 888 941 2e-04 49.7
clone1_deb bth:BT_0578 69.06 265 82 0 8 802 546 810 2e-101 372
clone1_deb bth:BT_0578 33.94 109 65 2 224 529 12 120 3e-08 62.4
clone1_deb bth:BT_0578 40.91 44 26 0 8 139 887 930 0.003 45.4
clone1_deb bth:BT_0578 35.00 40 26 0 671 790 411 450 2.0 36.2
clone1_deb bfs:BF2634 68.68 265 83 0 8 802 541 805 6e-100 366
clone1_deb bfs:BF2634 33.94 109 65 2 224 529 7 115 3e-08 62.4
clone1_deb bfs:BF2634 38.33 60 36 1 8 184 882 941 9e-04 47.4
Messages postés
5550
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
12 mai 2021
933
Et sur la 1èrte ligne, c'est quoi la première colonne ?

C'est :

- "clone1_deb"
- "clone1_deb chu"
- "CHU_0158" ?

Pour la "dernière colonne", je suppose que c'est "392", et que c'est sur cette valeur que tu feras un tri ultérieurement.

Ensuite, un hash, c'est une clef (unique) qui correspond à une donnée. Alors, je ne comprend pas bien quelle donnée tu utiliserais en clef unique, et correspondant à quelle donnée. En fait,... je doute que tu veuilles vraiment faire cela.

Comme demandé, si tu donnes un exemple des données que tu veux obtenir en résultat, et de code que tu as réalisé, cela sera bien plus clair que des explications qui sont, pour moi, trop elliptiques.


Dal
Messages postés
5550
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
12 mai 2021
933
ou.. éventuellement un hash de tableaux de valeurs correspondant à la clef.

si c'est ce qui te faut, tu peux faire comme expliqué là :

https://perldoc.perl.org/perldsc#Declaration-of-a-HASH-OF-ARRAYS

mais si tu avais un exemple de données que tu veux obtenir en résultat, cela aiderait vraiment à comprendre ce que tu veux faire.
Messages postés
5550
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
12 mai 2021
933
question subsidiaire ... c'est pour un devoir ?

Par exemple, en prenant tes données de départ (en les mélangeant un peu... car elles sont déjà dans l'ordre..., or tu dis avoir besoin de les trier) et en supposant qu'une clef utile identifiant ta 1ère colonne est "CHU_0158" (les caractères suivant les ":" et jusqu'au premier espace), j'obtiens cela en utilisant un hash de arrays dont la clef est cet identifiant et le contenu des arrays est constitué des chiffres de la dernière :

données de départ :
clone1_deb chu:CHU_0158 100.00 10 0 0 810 839 821 830 5e-108 24.3
clone1_deb bth:BT_0578 33.94 109 65 2 224 529 12 120 3e-08 62.4
clone1_deb chu:CHU_0158 71.16 267 77 0 2 802 545 811 5e-108 392
clone1_deb chu:CHU_0158 40.74 54 31 1 8 166 888 941 2e-04 49.7
clone1_deb chu:CHU_0158 32.76 116 71 1 221 547 18 133 1e-09 66.6
clone1_deb bfs:BF2634 33.94 109 65 2 224 529 7 115 3e-08 62.4
clone1_deb bth:BT_0578 69.06 265 82 0 8 802 546 810 2e-101 372
clone1_deb bth:BT_0578 35.00 40 26 0 671 790 411 450 2.0 36.2
clone1_deb bth:BT_0578 40.91 44 26 0 8 139 887 930 0.003 45.4
clone1_deb bfs:BF2634 38.33 60 36 1 8 184 882 941 9e-04 47.4
clone1_deb bfs:BF2634 68.68 265 83 0 8 802 541 805 6e-100 366

résultat attendu :

$ ./abdou3058.pl 
données capturées : CHU_0158 - 24
données capturées : BT_0578 - 62
données capturées : CHU_0158 - 392
données capturées : CHU_0158 - 49
données capturées : CHU_0158 - 66
données capturées : BF2634 - 62
données capturées : BT_0578 - 372
données capturées : BT_0578 - 36
données capturées : BT_0578 - 45
données capturées : BF2634 - 47
données capturées : BF2634 - 366
le tableau sous la clef BT_0578 contient 4 valeurs
les 5 plus grandes valeurs sont :
372
62
45
36
le tableau sous la clef CHU_0158 contient 4 valeurs
les 5 plus grandes valeurs sont :
392
66
49
24
le tableau sous la clef BF2634 contient 3 valeurs
les 5 plus grandes valeurs sont :
366
62
47

(note : tes données de départ contiennent moins de 5 valeurs pour chaque clef)

Dal
Messages postés
5550
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
12 mai 2021
933
en fait, tu dis avoir besoin d'afficher la ligne concernée, et pas seulement les valeurs finales, alors c'est juste une petit peu plus compliqué : il faut mettre dans le hash un tableau à deux dimensions, avec dans une colonne la valeur capturée et dans l'autre la ligne complète, et trier sur la première colonne.

je poste un code qui fait cela sur ton jeu de données.
Messages postés
5550
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
12 mai 2021
933
Salut

Sur la base du jeu de données que tu indiques dans ton message, voilà comment créer en Perl un hash de arrays bidimensionnels, contenant en clef un identifiant tiré de tes "premières colonnes", et en valeurs le nombre en dernière colonne sur lequel tu veux trier par clef et la ligne complète de sorte à pouvoir l'afficher.

#!/usr/bin/perl

use strict;
use warnings;

use List::Util qw[min];

my %hash;

# fabriquer le hash de arrays
while (my $st = <DATA>) {
    chomp $st;
    if ($st =~ m/.*:([^\s]+).* (\d+)/) {
        print "données capturées : $1 - $2\n";
        push ( @{ $hash {$1} }, [$2, $st]);
    } else {
        print "Erreur: format incorrect à la ligne\n$st\n";
    }
}

# pour chaque clef, déterminer les $n valeurs du tableau
# les plus grandes
my $n = 5;
foreach my $key (keys %hash) {
    my $nb = scalar @{ $hash {$key} };
    print "le tableau sous la clef $key contient $nb valeurs\n";
    print "les $n lignes ayant les plus grandes valeurs sont :\n";
    my @sorted = reverse sort { $a->[0] <=> $b->[0] } @{ $hash {$key} };
    foreach my $st (@sorted[0..(min($n,$nb)-1)]) {
        print "$st->[1]\n";
    }
}

__DATA__
clone1_deb chu:CHU_0158 100.00 10 0 0 810 839 821 830 5e-108 24.3
clone1_deb bth:BT_0578 33.94 109 65 2 224 529 12 120 3e-08 62.4
clone1_deb chu:CHU_0158 71.16 267 77 0 2 802 545 811 5e-108 392
clone1_deb chu:CHU_0158 40.74 54 31 1 8 166 888 941 2e-04 49.7
clone1_deb chu:CHU_0158 32.76 116 71 1 221 547 18 133 1e-09 66.6
clone1_deb bfs:BF2634 33.94 109 65 2 224 529 7 115 3e-08 62.4
clone1_deb bth:BT_0578 69.06 265 82 0 8 802 546 810 2e-101 372
clone1_deb bth:BT_0578 35.00 40 26 0 671 790 411 450 2.0 36.2
clone1_deb bth:BT_0578 40.91 44 26 0 8 139 887 930 0.003 45.4
clone1_deb bfs:BF2634 38.33 60 36 1 8 184 882 941 9e-04 47.4
clone1_deb bfs:BF2634 68.68 265 83 0 8 802 541 805 6e-100 366

cela donne :

$ ./abdou3058.pl 
données capturées : CHU_0158 - 24
données capturées : BT_0578 - 62
données capturées : CHU_0158 - 392
données capturées : CHU_0158 - 49
données capturées : CHU_0158 - 66
données capturées : BF2634 - 62
données capturées : BT_0578 - 372
données capturées : BT_0578 - 36
données capturées : BT_0578 - 45
données capturées : BF2634 - 47
données capturées : BF2634 - 366
le tableau sous la clef CHU_0158 contient 4 valeurs
les 5 lignes ayant les plus grandes valeurs sont :
clone1_deb chu:CHU_0158 71.16 267 77 0 2 802 545 811 5e-108 392
clone1_deb chu:CHU_0158 32.76 116 71 1 221 547 18 133 1e-09 66.6
clone1_deb chu:CHU_0158 40.74 54 31 1 8 166 888 941 2e-04 49.7
clone1_deb chu:CHU_0158 100.00 10 0 0 810 839 821 830 5e-108 24.3
le tableau sous la clef BF2634 contient 3 valeurs
les 5 lignes ayant les plus grandes valeurs sont :
clone1_deb bfs:BF2634 68.68 265 83 0 8 802 541 805 6e-100 366
clone1_deb bfs:BF2634 33.94 109 65 2 224 529 7 115 3e-08 62.4
clone1_deb bfs:BF2634 38.33 60 36 1 8 184 882 941 9e-04 47.4
le tableau sous la clef BT_0578 contient 4 valeurs
les 5 lignes ayant les plus grandes valeurs sont :
clone1_deb bth:BT_0578 69.06 265 82 0 8 802 546 810 2e-101 372
clone1_deb bth:BT_0578 33.94 109 65 2 224 529 12 120 3e-08 62.4
clone1_deb bth:BT_0578 40.91 44 26 0 8 139 887 930 0.003 45.4
clone1_deb bth:BT_0578 35.00 40 26 0 671 790 411 450 2.0 36.2

(comme indiqué précédemment, sur ce test, ton jeu de données comporte moins de 5 lignes par catégorie)

L'expressivité et la puissance de Perl permettent de faire cela en une 20aine de lignes.

Tu peux potasser perldoc si tu ne comprends pas tout.

et notamment https://perldoc.perl.org/perldsc#Declaration-of-a-HASH-OF-ARRAYS et https://perldoc.perl.org/perlretut sur les expressions rationnelles.

Si tu as des questions sur ce code après avoir compulsé la doc, exprime toi :-)

Dal
merci beaucoup de votre aide
ca a fonctionné parfaitement votre code
mon ordi a arreté de fonctionné j'ai pas pu l'essayé avant
j'ai une autre question par apport à un autre jeux de donnée je vais la poster dans le forum
bonne soirée merci ,
Messages postés
5550
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
12 mai 2021
933
De rien.

Comme tu n'as pas de questions, je suppose que tu as tout compris, et que tu n'as pas vraiment besoin de moi pour savoir comment créer un hash de arrays dans ta nouvelle question qui est beaucoup plus simple que celle-ci.

;-)

Dal
Messages postés
3
Date d'inscription
mardi 22 novembre 2016
Statut
Membre
Dernière intervention
22 novembre 2016

bonjour
ah ouii j'ai bien compris l'exemple et le code et ca a marché je me rappelle plus de ce que j'ai fait exactement j'ai pas suivi tous les détail du code mais ca m'as donnée une idées pour commencé c'est juste que j'ai perdu le code ds l'ordinateur qui a arreté de fonctionner , là j'ai un autre jeu de donnée j'ai lancé une question dans le site
merci pour votre aide , merci infiniment
Messages postés
5550
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
12 mai 2021
933
ce matin :

"mon ordi a arreté de fonctionné j'ai pas pu l'essayé avant"

cet après-midi :

"c'est juste que j'ai perdu le code ds l'ordinateur qui a arreté de fonctionner"

c'est toi qui vois quand tu as utilisé mon code

allez, bonne chance pour la suite :-)