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 difficile pour débutant


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 12
    Points
    12
    Par défaut comptage difficile pour débutant
    bonjour,
    je fais du perl que très rarement et suis toujours au stade débutant.
    c'est la suite du post regexp difficile.

    j'ai 2 fichiers qui contiennent des urls avec le nombre de fois trouvé dans mes logs.
    ex
    fichier1
    http://www.url1.com 10
    http://www.url2.fr 5
    fichier2
    http://www.url1.com 2
    http://www.url2.fr 3
    mon but est donc d'avoir le résultat suivant des 2 fichiers dans un fichier résultat.txt
    http://www.url1.com 12
    http://www.url2.fr 8
    eh bien ! je galère depuis quelques heures pour faire ça !
    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 $fic;
    my $rep="d:/tempo/";
    my $res="resultat.txt";
     
    getFiles($rep,\@fichiers);
     
    open F_ECRIRE,">$rep/$res"  or die "E/S : $!\n";
     
    foreach $fic(@fichiers){
      open F_LIRE,"$fic" or warn "E/S : $!\n";
       my $ligne;   
     
       while($ligne = <F_LIRE>){     
                if ($ligne =~ m{http://.*?\s+(\d+)}){
     
                $h_count{$1} += $2;
                }     
       }
     
      foreach my $key (sort {$h_count{$b} <=> $h_count{$a}} keys %h_count){
        print F_ECRIRE $key."\t".$h_count{$key}."\n";
     
      }
    }
    mon gros problème vient de la ligne, j'ai testé pleins de solutions mais j'obtiens pas mon résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($ligne =~ m{http://.*?\s+(\d+)}){
    merci de votre aide

  2. #2
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    voici l'idée :
    - tu crées un hash
    - tu listes chaque fichier et tu stockes pour chaque ligne du fichier l'url en clé et le nombre en clé. Au prealable, tu vérifies que la clé n'existe pas, si oui, alors tu incrémentes la valeur avec ton le count de ton url.

    A la fin du listing de tes fichiers, tu crées un nouveau fichier grâce à ton hash.

    Voilà, tu as l'algorithme nécessaire.

    Au boulot.

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 12
    Points
    12
    Par défaut suite difficile pour débutant
    bonjour,
    OK merci mais je maîtrise vraiment pas tout, je suis encore au stade de la bidouille ! je ne comprend pas encore tout et souvent c'est dans le besoin que je fais du perl et ensuite plus rien.

    j'ai testé la solution suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while($ligne = <F_LIRE>){     
                if ($ligne =~ m/http.*?\s+(\d+)/){
                #if ($ligne =~ m{http://.*?}) {
                print $ligne."\n";
     
                $h_count{$1} += $2;
                print $h_count."\n";
    mon print $ligne me donne le résultat suivant:
    http://0.channel01.facebook.com 1500
    http://0.channel02.facebook.com 1600
    http://google.fr 1000
    http://www.shufflepoint.com HTTP 1
    http://0.channel01.facebook.com 1000
    http://0.channel02.facebook.com 400
    http://google.fr 5000
    http://0.channel10.facebook.com 5236
    http://0.channel11.facebook.com 1061
    http://0.channel12.facebook.com 2758
    http://myspace.com 5

    mais mon résultat dans mon fichier est le suivant:
    1 0
    1600 0
    1500 0
    1000 0
    5236 0
    5000 0
    400 0
    1500 0
    1600 0
    1 0
    2758 0
    1000 0
    1061 0
    5 0

    je ne sais pas quoi faire, je patauge un peu ! et il me faut le résultat aujourd'hui donc c'est chaud !

    merci de votre aide

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 12
    Points
    12
    Par défaut suite des explications
    bonjour,

    $h_count est bien ma table de hash dans lequel on stock $1 et $2 ?

    on associe clé/valeur

    merci

  5. #5
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Bon, donne nous ton code complet, et un exemple de 2 fichiers

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 12
    Points
    12
    Par défaut suite des explications
    bonjour,
    voici mon code complet:
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    #!c:/perl/perl.exe 
    package test;
    #use warnings;
     
    my $fic;
    my $rep="d:/tempo/";
    my $res="resultat.txt";
     
    getFiles($rep,\@fichiers);
     
    open F_ECRIRE,">$rep/$res"  or die "E/S : $!\n";
     
    foreach $fic(@fichiers){
      open F_LIRE,"$fic" or warn "E/S : $!\n";
       my $ligne;   
     
       while($ligne = <F_LIRE>){     
                if ($ligne =~ m/http.*?\s+(\d+)/) {
                #if ($ligne =~ m{http://.*?}) {
                print $ligne."\n"; #test
     
                $h_count{$1} += $2;
                } 
       }
    }  
     
    foreach my $key (sort {$h_count{$b} <=> $h_count{$a}} keys %h_count){
                print $key."\n"; #test
                print F_ECRIRE $key."\t".$h_count{$key}."\n";      
    }          
     
    1;
     
    sub getFiles{
      my $repert = shift(@_);
      local *tableau = shift(@_);
      my $fichier;
      my @sousrepertoires;
     
      if (-d $repert){
        #print "repertoire :".$repert."\n"; #TEST
        opendir (REP,$repert)  or die "E/S : $!\n";
     
        while (defined ($fichier = readdir(REP))){
            #print $fichier."\n"; #TEST
            if ((!($fichier=~m/^\./))&&(-d "$repert/$fichier")){
                #print "c est un repertoire $repert/$fichier\n"; #TEST
                push @sousrepertoires,"$repert/$fichier"; 
     
            }else{
              if ((!($fichier=~m/^\./))&&($fichier=~m/^Test/)){
               push @tableau,"$repert/$fichier"; 
               #print "ajout du fichier : $repert/$fichier\n"; #TEST
              }  
            }
        }
        foreach $fichier(@sousrepertoires){
          getFiles($fichier,\@tableau);    
        }
     }  
    }
    pour les fichiers voici un exemple :
    fichier Test1.txt
    http://0.channel01.facebook.com 1500
    http://0.channel02.facebook.com 1600
    http://google.fr 1000
    http://www.shufflepoint.com HTTP 1
    fichier Test2.txt
    http://0.channel01.facebook.com 1000
    http://0.channel02.facebook.com 400
    http://google.fr 5000
    http://0.channel10.facebook.com 5236
    http://0.channel11.facebook.com 1061
    http://0.channel12.facebook.com 2758
    http://myspace.com 5

    donc je veux le résultat suivant dans le fichier resultat.txt
    http://google.fr 6000
    http://0.channel10.facebook.com 5236
    http://0.channel12.facebook.com 2758
    http://0.channel01.facebook.com 2500
    http://0.channel02.facebook.com 2000
    http://0.channel11.facebook.com 1061
    http://myspace.com 5
    http://www.shufflepoint.com HTTP 1

    merci de ton aide et des explications !

  7. #7
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    C'est ton jour de chance, je vais te faire un petit script pour 14h.

  8. #8
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Pour un script aussi simple, tu n'as pas besoin de faire de l'objet, c'est inutile.

    Voici ton script complétement refait. Je pense qu'il y a assez de commentaires pour que tu puisses le comprendre.

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $repertoire = 'd:/tempo';
    my $fichier_resultat = 'resultat.txt';
     
    # Récupération des fichiers dans les répertoires et sous répertoires
    # on récupère les fichiers de type testX.txt
    my @mes_fichiers = grep {/test\d*\.txt$/i} getFiles($repertoire);
     
    # On stocke toutes les urls et leur nombre dans ce hash
    my %Totalite_urls;
     
    # Lecture de tous les fichiers
    foreach my $fichier ( @mes_fichiers ) {
     
      # ouverture du fichier
      open( my $fh, '<', $fichier ) or die("Impossible de lire $fichier\nE/S : $!\n");
     
      # Lecture ligne à ligne
    FICHIER:
      while ( my $ligne = <$fh> ) {
     
        # supression retour chariot
        chomp $ligne;
     
        # si $url et $nombre incorrect, on passe à la suite
        my ( $url, $nombre );
        unless ( ( $url, $nombre ) = $ligne =~ m{(http.*?)\s+(\d+)}i ) {
          next FICHIER;
        }
     
        # stockage de l'url
        $Totalite_urls{$url} += $nombre;
      }
     
      # Fermeture fichier
      close($fh);
    }
     
    # A ce stade, notre hash contient toute les urls, on les afiche
    # ouverture du fichier resultat
    open( my $fh_resultat, '>', $fichier_resultat )
      or die("Impossible d'ecrire dans $fichier_resultat\nE/S : $!\n");
     
    # Lecture du hash en triant les urls
    foreach my $url ( sort keys %Totalite_urls ) {
      print {$fh_resultat} "$url $Totalite_urls{$url}\n";
    }
     
    # Fermeture fichier
    close($fh_resultat);
     
    sub getFiles {
      my ($repertoire) = @_;
      my @fichiers;
     
      # Ouverture d'un répertoire
      opendir( my $FhRep, $repertoire )
        or die "impossible d'ouvrir le répertoire $repertoire\n";
     
      # Liste fichiers et répertoire sauf (. et ..)
      my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
     
      # Fermeture du répertoire
      closedir($FhRep);
     
      # On récupère tous les fichiers
      foreach my $nom (@Contenu) {
     
        # Fichiers
        if ( -f "$repertoire/$nom" ) {
          push( @fichiers, "$repertoire/$nom" );
        }
     
        # Repertoires
        elsif ( -d "$repertoire/$nom" ) {
     
          # recursivité
          push( @fichiers, getFiles("$repertoire/$nom") );
        }
      }
     
      return @fichiers;
    }

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 12
    Points
    12
    Par défaut suite difficile pour débutant
    bonjour,
    un grand merci pour ton temps passé et tes explications.

    mais j'ai un souci, c'est que le fichier résultat est vide !

    merci

  10. #10
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Rajoute après cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @mes_fichiers = grep {/test\d*\.txt$/i} getFiles($repertoire);
    ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "il y a ",scalar(@mes_fichiers)," fichiers dans $repertoire\n";
    et teste

  11. #11
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 12
    Points
    12
    Par défaut suite difficile pour débutant
    bonjour,
    OK
    il y a 2 fichiers dans d:/tempo

    j'ai ajouté
    print $fichier."\n";
    après
    open( my $fh, '<', $fichier ) or die("Impossible de lire $fichier\nE/S : $!\n");

    réponse:
    d:/tempo/test1.txt
    d:/tempo/test2.txt

    je pense (?) que c'est plus du côté des urls , non ?
    merci

  12. #12
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    je me suis basé sur tes exemples, sauf si tu m'as donné de mauvais exemples ?
    car moi j'obtiens bien ceci :

  13. #13
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 12
    Points
    12
    Par défaut suite difficile pour débutant
    bonjour,
    j'ai une piste, j'avais des vieux fichiers nommés test1 et test2 ,
    mes bons fichiers pour ce test commence par testxxx.txt et testxxx.txt
    mais il les trouve pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @mes_fichiers = grep {/test\d*\.txt$/i} getFiles($repertoire);
    il y a 0 fichiers dans d:/tempo

    merci

  14. #14
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    oui mais testxxx.txt et testxxx.txt

    xxx= quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @mes_fichiers = grep {/test\d*\.txt$/i} getFiles($repertoire);
    Essaye de comprendre la regex, elle cherche des fichiers dont le nom se termine par testX.txt avec X = un nombre ou rien.

  15. #15
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 12
    Points
    12
    Par défaut suite difficile pour débutant
    est-ce que c'est à cause des chiffres, mes fichiers se nomment
    test051.txt et test052.txt ????

    merci

  16. #16
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Citation Envoyé par Eric5959 Voir le message
    est-ce que c'est à cause des chiffres, mes fichiers se nomment
    test051.txt et test052.txt ????

    merci
    Il devrait les trouver

  17. #17
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 12
    Points
    12
    Par défaut suite difficile pour débutant
    OK c'est bon pour le nom des fichiers mais il y a un message :
    Can't use string ("http://0.channel01.facebook.com ") as a symbol ref while "strict refs" in use at D:\test_perl\test.pl line 25, <$fh> line 1.

    merci

  18. #18
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if ((!($fichier=~m/^\./))&&($fichier=~m/^Test/)){
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if ((!($fichier=~m/^\./))&&($fichier=~m/^Test/i)){
    ?

    edit: désolé, c'était pour les histoires de nom de fichier

  19. #19
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Citation Envoyé par Eric5959 Voir le message
    OK c'est bon pour le nom des fichiers mais il y a un message :
    Can't use string ("http://0.channel01.facebook.com ") as a symbol ref while "strict refs" in use at D:\test_perl\test.pl line 25, <$fh> line 1.

    merci
    ah, bizarre, elle correspond à quelle ligne ?

  20. #20
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 12
    Points
    12
    Par défaut suite difficile pour débutant
    en supprimant use strict;
    j'ai plus le message et ça perturbe pas l'exécution.

    en revanche le résultat n'est pas classé dans l'ordre décroissant !

    il n'y a plus que ça et c'est fini.
    merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Un select un peu difficile pour un débutant
    Par mitchb dans le forum Débuter
    Réponses: 1
    Dernier message: 27/03/2007, 22h35
  2. Réponses: 2
    Dernier message: 17/10/2005, 22h16
  3. aide petit programme pour débutant
    Par kartp0rqx dans le forum C
    Réponses: 16
    Dernier message: 14/10/2005, 19h31
  4. Aide pour débutant : addition
    Par playentry dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/03/2005, 19h08

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