IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

traitement de fichier et une table hash


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut traitement de fichier et une table hash
    bonsoir tous le monde ; je voudrai 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 )
    voilà un exemple de mes données et merci d'avance

    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

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Si tu crées un hash avec la première colonne comme clé, comme celle-ci n'est pas unique, il faut expliquer comment tu gères les différents scores pour une même clé.

    En dehors de cela, j'aurais plutôt fait quelque chose comme cela :
    - lire les lignes dans un tableau à deux dimensions (premier élément : la ligne complète, deuxième élément : le score)
    - trier ce tableau par ordre décroissant du score
    - extraire la tranche [0..4] du tableau trié

    En fonction des explications que tu vas donner pour l'histoire de la clé unique, il faudra peut-être revoir l'algorithme proposé.
    A vue de nez, ça doit tenir en une ligne pas trop longue (peut-être deux).

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ perl -E 'say map $_->[0], (sort { $b->[1] <=> $a->[1] } map { [ $_, (split /\s+/, $_)[-1] ] } <STDIN>)[0..4]' <data.txt
    clone1_deb chu:CHU_0158 71.16 267 77 0 2 802 545 811 5e-108 392
    clone1_deb bth:BT_0578 69.06 265 82 0 8 802 546 810 2e-101 372
    clone1_deb bfs:BF2634 68.68 265 83 0 8 802 541 805 6e-100 366
    clone1_deb chu:CHU_0158 32.76 116 71 1 221 547 18 133 1e-09 66.6
    clone1_deb bth:BT_0578 33.94 109 65 2 224 529 12 120 3e-08 62.4

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Pour info, Abdou, le mécanisme employé ci-dessus par Philou (++) est un exemple presque classique de la "transformation de Schwartz" ou "transformée de Schwartz" (Schwartz Transform). Tu peux faire une recherche sur cette expression si tu as besoin de mieux comprendre le fonctionnement.

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je crois qu'on parle plutôt de transformée Schwartzienne (Schwartzian transform en anglais)

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Oui, tu as raison, je me suis trompé, en anglais c'est Schwartzian Transform, mais les auteurs de l'article que tu cites disent eux-mêmes que ça aurait été plus juste de dire Schwartz Transform.

    Quant à la traduction française, je préfère personnellement "transformation de Schwartz" ou à la rigueur "transformée de Schwartz", mais ce n'est qu'une opinion personnelle.

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je suis bien d'accord.
    Dans tous les cas, cette transformée permet une densité et une efficacité redoutable dans les tris complexes.

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 899
    Points : 6 673
    Points
    6 673
    Par défaut
    En utilisant la transformé de Guttman-Rosler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -e'print map {substr $_, 8} (sort map {sprintf "%08.1f%s", 1e5-(split)[-1], $_} <>)[0..4]' <data
    Pratiquée comme telle, en utilisant sprintf, cela suppose de connaître les bornes de la valeur en question et sa précision. Ici, j'utilise 10^5 comme maximum (pour être large) et une seule décimale, au vu du court échantillon de données.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    bonsoir
    en faite mon PC a arreté de fonctionner pour pouvoir essayer ce que vous me proposer , merci pour l'attention que vous portez pour ma question , je vous réponderai dés que je trouve un nouveau PC parceque je dois rendre tous le projet avant le 1 er du mois prochain merci beaucoup
    bonne soirée tous le monde

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    bsr tous le monde , *
    si il est parfait l'algorithme que t'as proposé mais je suis coincé pour déclarer un tableau à deux dimension j'ai
    @liste qui contien mes lignes
    et
    @score qui contien mes score
    il me reste qu'a créer le tableau
    bonne soirée

  11. #11
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Dans le script uniligne présenté par Philou, cette partie du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map { [ $_, (split /\s+/, $_)[-1] ] }
    crée un tableau à deux dimensions.

    Si tu veux décomposer en instructions plus élémentaires, tu peux essayer ceci pour créer un tableau à 2 dimensions (en supposant que tu lises les données depuis un fichier ouvert avec le file handle $input):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    my @AoA; # array of arrays, c'est-à-dire tableau à 2 dimensions
    while (my $line = <$input>) {
        chomp $line;
        my @temp_array = split /\s+/, $line;
        my $score = @temp_array[-1];
        push @AoA, [$line, $score];
    }
    Ensuite, tu peux trier le tableau à 2 dimensions sur le deuxième champ de chaque sous-tableau, récupérer les 5 premiers enregistrements et extraire le champ ligne entière.

    Mais le code de Philou fait tout cela en une seule ligne de code.

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    bonsoir
    en faite j'ai suivi le 1 er Algorithme de philo ca m'a donné des resultats parfait mais pour le code celui de philo je peut pas l'utiliser parceque je suis qu'un débutant et je doit montrer ce que je fait à mon prof mais le code de lolo array of array ca m'interesse je l'ai pris j'aurai certainement besoin
    merci à vous tous ce probeleme est résolu mais je vais aussi ouvrir une nouvelle discussion jesuis coincé dans un autre point
    je lance déja mon probleme ici
    bonne soirée

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    j'ai des données qui ressemble à ca dans un fichier .txt :
    # Eukaryotes
    ## Animals
    ### Vertebrates
    #### Mammals
    T01001 hsa H.sapiens Homo sapiens (human)
    T01005 ptr P.troglodytes Pan troglodytes (chimpanzee)
    T01028 mcc M.mulatta Macaca mulatta (rhesus monkey)
    ###
    .....
    ce que je veux est de matcher tous ce qui commence par ### et de compter les lignes qui commence par un identifiant deriere je vois pas une stratégie claire pour résoudre mon probleme
    merci d'avance de votre aide
    bonne soirée

  14. #14
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Comment ferais-tu avec un papier et un crayon? C'est une question sérieuse: réfléchis exactement aux étapes (explicites ou implicites) pour le faire manuellement. Après il suffit d'automatiser.

    Par exemple (à supposer que j'ai compris ce que tu veux faire), je pourrais vouloir:
    • Je lis le fichier en entrée;
    • j'écris sur une feuille mon espèce animale (je veux dire un truc genre "Mammals") commençant par des "#"
    • je compte les lignes commençant par un identifiant jusqu'au prochain "#" et j'écris le nombre sur la feuille de papier en face de l'espèce
    • je recommence avec l'espèce suivante.


    Une fois la stratégie manuelle bien élaborée, il faut mettre en musique. Tu sais, je suppose lire un fichier, lire un identifiant d'espèce, etc. Il suffit de l'écrire en Perl. A toi de jouer. Si tu as des difficultés, montre ton code, on t'aidera à le corriger.

    Comprends bien que ce serait te rendre un bien mauvais service que d'écrire le code à ta place: tu n'apprendrais jamais. Il faut que tu te lances.

  15. #15
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    bonsoir
    oui c'est vrai lolo78 , le probleme est que c'est un projet long et je débute en perl mon code complet est trés long , mais voilà l'étape ou je suis coincé , voilà déja mon code actuel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    use strict;
    use warnings;
     
    ######question 2 PARTIE III#### script correct ici à garder
     
     
    my $taxo;
    open($taxo ,'<','taxonomy');
    my %hash_clade_13;
     
    my @taxonomy;
    while (my $ligne = <$taxo>){
    push (@taxonomy, $ligne);
    #print "$ligne\n";
     
    }
    my @liste;
    my $kays;
    @liste = grep {$_=~m/^T\d\d\d\d\d|^###\s/}@taxonomy;
    #print "@liste\n";
    my $compteur=0;
    foreach (@liste){
    my $z++;
    if ($_=~m/^T\d\d\d\d\d/i){
    $compteur++;
     
     
    }
    if($_=~m/^###\s/){
    $kays=$_;
     
    $hash_clade_13{$kays} = $compteur;
    $compteur=0;}
    }
     
     
    foreach my $i (keys (%hash_clade_13)){
    #print "$i=>$hash_clade_13{$i}\n"
     }
    foreach  (keys(%hash_clade_13)){
    if ($hash_clade_13{$_}>13){
    print "$_=>$hash_clade_13{$_}\n";}
    }
    le probleme est que pour chaque clade (groupe taxonomique )
    il me sort la liste des identifiant correspondante à la clade d'avant
    je vais joidre le fichier sur lequel je travaille actuellement parceque ca c'est qu'une étape de la question , je devrais ensuite séparer chaque clade et la liste des especes(ex:hsa,fnu,..) qui suivent pour pouvoir comparer les resultat avec les résultats de BLAST (autre fichier)
    bonne soirée à tous


    ### Fusobacteria
    T00077(2002) fnu F.nucleatum Fusobacterium nucleatum
    ### Planctomyces
    T00134(2003) rba R.baltica Rhodopirellula baltica
    ### Verrucomicrobia
    T00689(2008) ote O.terrae Opitutus terrae
    T00727(2008) min M.infernorum Methylacidiphilum infernorum
    T00736(2008) amu A.muciniphila Akkermansia muciniphila
    ### Chlamydia
    T00017(1998) ctr C.trachomatis Chlamydia trachomatis D/UW-3/CX (serovar D)
    T00280(2005) cta C.trachomatis_A Chlamydia trachomatis A/HAR-13 (serovar A)
    T00645(2008) ctb C.trachomatis_434Bu Chlamydia trachomatis 434/Bu
    T00646(2008) ctl C.trachomatis_L2b Chlamydia trachomatis L2b/UCH-1/proctitis
    T00028(2000) cmu C.muridarum Chlamydia muridarum
    T00021(1999) cpn C.pneumoniae Chlamydophila pneumoniae CWL029
    T00029(2000) cpa C.pneumoniae_AR39 Chlamydophila pneumoniae AR39
    T00032(2000) cpj C.pneumoniae_J138 Chlamydophila pneumoniae J138

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer des noms de fichiers dans une table ?
    Par florus dans le forum Access
    Réponses: 5
    Dernier message: 25/03/2006, 17h34
  2. Charger un fichier dans une table
    Par luchot dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 07/02/2006, 17h21
  3. Réponses: 7
    Dernier message: 30/01/2006, 21h36
  4. enregistrer le chelin d'un fichier dans une table
    Par piscine dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/09/2004, 15h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo