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 :

comptage en perl


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 comptage en perl
    bonjour tous le monde
    j'ai une liste qui ressemble à ca :
    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
    @t =(
    ### Actinobacteria
    T0003
    T0007
    T0016
    ### Nematodes 
    T0009
    ### Acidobaacteria 
    T0004
    T0107
    T0116
     ce que je veux est de compter les lignes qui suivent chaque clade séparément 
    j'ai galéré mais j'y arrive pas 
    mon code actuel est :
    @liste = grep {$_=~m/^T\d\d\d\d\d|^###\s/}@taxonomy;
    foreach (@liste){
    if ($_=~m/^T\d\d\d\d\d/){
    $compteur=1;
    push (@sax,$compteur);
     
     
    }
     
     
     
     
    }
    merci d'avance de votre aide; bonne journée

  2. #2
    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
    bonjour;
    mon code actuel ressemble à ca :

    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
    my $taxo;
    open($taxo ,'<','taxonomy');
     
    my @taxonomy;
    while (my $ligne = <$taxo>){
    push (@taxonomy, $ligne);
    #print "$ligne\n";
     
    }
    my @liste;
    my @dox;
     
    my @sax;
    my @clade3;
    my $z=0;
    my %hash;
    @liste = grep {$_=~m/^T\d\d\d\d\d|^###\s/}@taxonomy;
    my $compteur=0;
    foreach (@liste){
    if ($_=~m/^T\d\d\d\d\d/i){
    $compteur++;
    push (@sax,$compteur);
    }
    elsif($_=~m/^###\s/){
    $compteur=0;}
    print "$compteur:$_\n";
     
    }
     
    <>;
    mais ce que je veux est de compter les lignes qui commence par T pour chaque clade (^###)
    j'y arrive pas merci de vos aide
    bonne journée

  3. #3
    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
    voilà mon code actuell
    mais les résultats qui sortent ne correspondent pas pour chaque clade il m'attribue le comptage du clade précédent
    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
    @liste = grep {$_=~m/^T\d\d\d\d\d|^###\s/}@taxonomy;
    my $compteur=0;
    foreach (@liste){
    my $z++;
    if ($_=~m/^T\d\d\d\d\d/i){
    $compteur++;
     
     
    }
    if($_=~m/^###\s/){
     
    $hash{$_} = $compteur;
    $compteur=0;}
    }
     
     
    foreach my $i (keys (%hash)){
     print "$i=>$hash{$i}\n"}

  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
    Bonsoir,

    Lis ton fichier ligne à ligne.
    Si tu rencontres une espèces (une ligne de type ### Actinobacteria), extrait le nom qui te servira de clef pour un hachage.
    Continue à lire les lignes, et compte les lignes commençant par T
    Si tu rencontres une ligne ne commençant pas par T, tu commences une nouvelle espèce; il faut alors remplir le hachage avec le nom mémorisé précédemment comme clé et le compteur;
    là, tu réinitialise le compteur, mémorise l nouvelle espèce et recommence pour la suite.

    Après avoir fini de lire le fichier, ne pas oublier de remplir le hachage avec la dernière espèce traitée.

  5. #5
    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

    c'est exactement l'algorithme que j'ai suivi , mais ca me donne des resultats bizzare il attribue le comptage à une clé qui ne corresponde pas au final j'arrive à sortir les clés et aussi le comptage mais il donne arbitrairement chaque valeur à n'importe quel clé
    aussi j'ai besoin de savoir comment marquer chaque clé (^###) sur le coup sans faire le while
    voilà mon code
    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#### 
     
     
    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";}
    }
    merci beaucoup lolo78 bonne soirée

  6. #6
    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
    aussi
    j'essaie de faire un hash de tableaux avec les clade (### Alveolates par ex) qui contient plusieurs valeurs qui sont les especes (hsa par ex ) donc plusieurs clés associes à plusieurs especes chacune , mais le code que j'ai ne m'attrappe que 21 clés tant que j'attendais à 47 dans mon fichiers et aucune especes associes avec les clés voilà mon code
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $taxo;
    open($taxo ,'<','taxonomy');
    my @taxonomy;
    while (my $ligne = <$taxo>){
    push (@taxonomy, $ligne);
     
    }
    my @t;
    my @esp;
    my $x;
    my $Z=0;
    my (%donnees, $dk);
    foreach $x(@taxonomy){
    if ($x=~m/^###\s/){$dk=$x;$Z++}
    if ($x=~m/^T\d\d\d\d\d\s/g){
    @esp=split/\s/,$x;
    ${$donnees{$dk}}[$Z]=$esp[1];
     
    }
     
    }
     
    my @liste_cles = keys (%donnees);
    my $P=$#liste_cles + 1;
    print "$P\n";
    print "@liste_cles\n";
    my $A=@{$donnees{"### Alveolates"}};
     
     
     
     
    <>
    merci par avance

  7. #7
    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
    Bonjour,

    voici un exemple simple avec des données sur les couleurs, utilisant un simple hachage:
    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
     
    use strict;
    use warnings;
     
    my @couleurs = qw /
        ##bleus
        ciel
        marine
        outremer
        ##rouges
        cerise
        brique
        sang_de_boeuf
        ecarlate
        ##jaune
        d-or
        serein /;
     
    my (%histogramme, $couleur_base);;
    for my $coul (@couleurs) {
         if ($coul =~ /#+(\w+)/) {
         	$couleur_base = $1;
         	next;
         }
         $histogramme{$couleur_base} ++;
    }
    print "$_ $histogramme{$_}\n" for sort keys %histogramme;
    Ce qui affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bleus 3
    jaune 2
    rouges 4

  8. #8
    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
    bonjour
    merci beaucoup lolo78 votre code est claire et ca marche, avec mes données aussi mais je comprends pas qu'est ce que signifi next dans ce contexte et for sort keys à la fin et comment t'as lancé le compteur , aussi moi j'ai essayé qu'avec la fonction foreach est ce que c'est pareil svp ??
    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
    my $taxo;
    open($taxo ,'<','taxonomy');
    my %hash_clade_13;
    my $clade_especes;
    my @taxonomy;
    while (my $ligne = <$taxo>){
    push (@taxonomy, $ligne);
    #print "$ligne\n";
     
    }
    my @liste;
    @liste = grep {$_=~m/^T\d\d\d\d\d|^###\s/}@taxonomy;
    for my $x(@liste){
    if ($x =~ /^###\s(\w+)/){
    $clade_especes=$1;
    next;
     
    }
    $hash_clade_13{$clade_especes}++;
     
    }
     
    print "$_ $hash_clade_13{$_}\n" for sort keys %hash_clade_13;
     
    <>;
    merci beaucoup

  9. #9
    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
    Bonjour,

    Sur le next: si la ligne commence par #, je mets à jour $couleur_base (pour alimenter ensuite le hachage de compteurs) et le next dit de passer à l'élément suivant, car je ne veux pas effectuer l'incrémentation du compteur pour la ligne de titre. Dans ce cas, on aurait aussi bien pu écrire!:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for my $coul (@couleurs) {
        if ($coul =~ /#+(\w+)/) {
            $couleur_base = $1;
        } else {
            $histogramme{$couleur_base} ++;
        }
    }
    A la fin, on boucle sur les clefs diu hachage pour imprimer leur valeur et les compteurs associés. Le sort est ici assez inutile, il trie les clef du hachage.

    Sinon, "for" et "foreach" sont synonymes et font la même chose.

  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
    merci beaucoup des explications j'ai trié aprés que les clades qui ont plus de 13 especes voilà le code
    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
    for my $x(@liste){
    if ($x =~ /^###\s(\w+)/){
    $clade_especes=$1;
    next;
     
    }
    $hash_clade_13{$clade_especes}++;
     
    }
     
    my %hash_clade_sorted;
    my $clade_espece_sorted;
    print "PARTIE III(question 2):les clades qui ont plus que 13 especes sont :\n";
    while( my ($k,$v) = each(%hash_clade_13) ) {
    if ($v>13) {
    $clade_espece_sorted=$k;
    $hash_clade_sorted{$clade_espece_sorted}=$v;
     
    print "Clef=$clade_espece_sorted=> Valeur=$hash_clade_sorted{$clade_espece_sorted}\n";
    }
     
    }
    ca marche parfaitement je passe à une autre question
    bonne journée à vous tous

  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
    Bonjour,

    je te conseille très fortement de prendre a peine d'indenter ton code correctement (espaces en début de ligne pour faire apparaître la structure logique du programme), comme je l'ai fait dans mes exemples de code. Cela te fera gagner beaucoup de temps, surtout quand tes programmes deviendront plus complexes. Le compilateur s'en moque, mais le lecteur humain y tient beaucoup. C'est vraiment essentiel.

  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
    oui c est vrai merci c'est pour ca j'oublie à chaque fois les ; et {}
    merci infiniment de votre aide

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

Discussions similaires

  1. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  2. [langage] Inclure de perl en c !!!
    Par ryo00 dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2002, 10h03
  3. Réponses: 2
    Dernier message: 30/05/2002, 08h54
  4. [réseaux] Bench en Perl pour avoir le débit entre 2 pc
    Par Frich dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 22/05/2002, 17h22
  5. [web] Cherche un conseil pour un livre perl-tk
    Par Anonymous dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 29/04/2002, 15h35

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