Traitement de fichier

abdou3058 -  
[Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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
    0
  2. abdou3058
     
    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
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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
      0
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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.
      0
    3. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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
      0
    4. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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.
      0
  3. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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
    0
  4. abdou3058
     
    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 ,
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. abdou3058 Messages postés 3 Statut Membre
     
    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
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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 :-)
      0