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 :

compter nombre de mots-> tableau de hash


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Par défaut compter nombre de mots-> tableau de hash
    Bonjour,

    Je veux compter le nombre de fois qu'un élement apparaît
    papa xxx xxxx xxxx xxxx
    mama xxx xxx xxx xxx
    papa xxx xxxx xxxx xxxx
    toto xxx xxxx xxxx xxxx
    papa xxx xxxx xxxx xxxx

    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
    while (my $ligne = <DATA> ) {
    chomp $ligne;
    if($ligne =~ /(.+)\t([0-9]+)\t(.+)\t(.+)$/){
    # je récupère la clé et la valeur
    my $key = $1;
    my $value = 1;
    if (exists $in_file{$key}) {
     # la clé existe déjà (ie valeur de la clé=1), on ajoute la valeur à la valeur déjà présente
    $value = $value + 1;
    $in_file{$key} = $value;	
     
     }
    else {
    # la clé n'existe pas, on l'ajoute avec la valeur correspondante
    $in_file{$key} = $value;
    }
    }
    }
    foreach my $id (sort keys %in_file) {
      print "$id=>$in_file{$id}\n";
    }
    j'obtiens au final
    mama xxx=>1
    papa xxx=>2 # je devrais avoir 3!!!
    toto xxx=>1

    pourquoi papa=>3

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    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
    #!/usr/bin/perl
    use Carp;
    use strict;
    use warnings;
     
    my %mots;
    while ( my $ligne = <DATA> ) {
      chomp $ligne;
      my ( $mot1, $mot2, $mot3, $mot4 ) = split /\s+/, $ligne;
      if ( defined $mot1 ) { $mots{$mot1}++; }
    }
    foreach my $un_mot ( sort { $mots{$a} <=> $mots{$b} } keys %mots ) {
      print "$un_mot => $mots{$un_mot}\n";
    }
     
    __DATA__
    papa  14  aa  zz
    mama  13 ee rr
    papa  55  tt yy
    toto  68621 uu ii
    papa  88  oo pp
    toto => 1
    mama => 1
    papa => 3
    Dans ton programme, tu pourras remplacer /s+ par \t si tes données sont dans un fichier.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Par défaut
    Merci beaucoup,

    * pourquoi utiliser use Carp; ?
    * qu'est ce qui ne va pas dans mon script? pourquoi la dernière ligne de mon fichier n'est pas prise en compte?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Par défaut
    c'est ton value=1 dans la boucle qui te réinitialise ton compteur.... au mieux tu auras (value=1)+1, donc 2

    De toutes façons il est compliqué pour rien ton algo.... sans vouloir critiquer....

  5. #5
    Membre émérite
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Par défaut
    Mon avis est qu'il est inutile de verifier si la clé existe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if($ligne =~ /(.+)\t([0-9]+)\t(.+)\t(.+)$/){
    $mots{$1}++;
    } 
     
    foreach my $un_mot ( sort { $mots{$a} <=> $mots{$b} } keys %mots ) {
      print "$un_mot => $mots{$un_mot}\n";
    }

    Z.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Par défaut
    Merci

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

Discussions similaires

  1. Compter nombre de mots dans une cellule Excel
    Par nkhalidy dans le forum Excel
    Réponses: 6
    Dernier message: 12/07/2017, 21h12
  2. compter le nombre de mot dans une ligne fichier sous shell
    Par ninsekh dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 18/12/2008, 17h54
  3. Réponses: 3
    Dernier message: 17/11/2008, 23h48
  4. Réponses: 3
    Dernier message: 08/07/2008, 11h06
  5. Compter nombre de mots dans une chaîne.
    Par xVINCEx dans le forum C++
    Réponses: 22
    Dernier message: 24/11/2004, 13h33

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