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 le nombre d'éléments dans un fichier texte


Sujet :

Langage Perl

  1. #1
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut Compter le nombre d'éléments dans un fichier texte
    Bonjour

    J'ai un fichier texte avec le contenu suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Windows Firefox 2007/11/19 00:10:55
    Windows Firefox 2007/11/19 00:15:10
    Windows MSIE 2007/11/20 07:01:50
    A partir de ces informations, je souhaiterai afficher ces données sous cette forme:
    Je récupère ces infos via un module dont voici un extrait de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sub browser
    {
    	our $browser=$ENV{'HTTP_USER_AGENT'};
    	if ($ENV{'HTTP_USER_AGENT'} =~ m/MSIE/)
    	{
    		$browser="MSIE";
    	}
     
    	elsif ($ENV{'HTTP_USER_AGENT'} =~ m/Firefox/)
    	{
    		$browser="Firefox";
    	}
    }
    Bien entendu, une fonction est consacrée à recueillir l'os et la date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    my @infos=("$Stats::user_ip","$Stats::user_host","$Stats::os","$Stats::browser","$Stats::lang","$Stats::date");
    
    open (FILE, "$logfile");
    my @browser=("MSIE", "Firefox");
    while (<FILE>)
    {
    	$browser=@infos[3];
    	foreach(@infos[3])
    	{
              Instructions
    	}
    }
    close (FILE);
    Suis-je sur la bonne voie ?

    Avez-vous quelques exemples ou bien une piste afin de pouvoir débuter ?

    Merci

  2. #2
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    J'avoue que je ne comprends pas du tout l'intérêt du if dans cette partie du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sub browser
    {
    	our $browser=$ENV{'HTTP_USER_AGENT'};
    	if ($ENV{'HTTP_USER_AGENT'} =~ m/MSIE/)
    	{
    		$browser="MSIE";
    	}
     
    	elsif ($ENV{'HTTP_USER_AGENT'} =~ m/Firefox/)
    	{
    		$browser="Firefox";
    	}
    }
    Ou quelque chose m'échappe, ou la première ligne du sous programme est amplement suffisante (encore qu'une variable globale déclarée dans un sous-programme, ça fait un peu bizarre).

    Mais ce n'est pas vraiment la question, ici.

    Alors, pour ce que tu cherches, tu vas découvrir que les tableaux associatifs sont très pratiques.

    Si ton but est simplement de compter les occurences des differents browsers dans ton fichier, qui a donc, si j'ai bien compris, un format rigoureusement constant, une routine comme celle qui suit devrait faire l'affaire (partant du principe que le fichier s'appelle "logs").
    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
    my $entree = "logs";
     
    open IN, "<$entree";
    my %rapport;
     
    while(<IN>)
    {
    # on récupère le nom du browser dans la ligne du fichier (deuxième entrée)
            my $browser=(split /\s/)[1];
    # et on incrémente la valeur associée dans la table associative, sachant que
    # Perl se débrouille pour changer la valeur non définie au départ en zéro pour les 
    # opérations arithmétiques.
            $rapport{$browser}++;
    }
    close IN;
     
    #affichage du résultat
    foreach my $browser (keys(%rapport))
    {
            print "$browser : $rapport{$browser} \n";
    }
    Avantage : tu n'as même pas besoin de te limiter à MSIE et FireFox, tu auras également les résultats de Konqueror, Opera, Seamonkey ou autres.

  3. #3
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Bonjour Schmorgluck

    Tout d'abord, merci pour ta réponse.

    Citation Envoyé par Schmorgluck Voir le message
    J'avoue que je ne comprends pas du tout l'intérêt du if ...
    Si je devais uniquement utiliser la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    our $browser=$ENV{'HTTP_USER_AGENT'};
    cela ne permettrait pas d'authentifier avec certitude ton navigateur et c'est aussi valable avec le système d'exploitation.

    Sous Firefox dernière version, voici le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9
    Sous Internet Explorer 6.0:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
    Comprends-tu pourquoi l'utilisation des if ?

    Le code est placé dans un module:
    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
    package Stats;
     
    use strict;
     
    sub browser
    {
    	our $browser=$ENV{'HTTP_USER_AGENT'};
    	if ($ENV{'HTTP_USER_AGENT'} =~ m/MSIE/)
    	{
    		$browser="MSIE";
    	}
    	elsif ($ENV{'HTTP_USER_AGENT'} =~ m/Firefox/)
    	{
    		$browser="Firefox";
    	}
    	elsif ($ENV{'HTTP_USER_AGENT'} =~ m/Opera/)
    	{
    		$browser="Opera";
    	}
    	elsif ($ENV{'HTTP_USER_AGENT'} =~ m/Safari/)
    	{
    		$browser="Safari";
    	}
    	elsif ($ENV{'HTTP_USER_AGENT'} =~ m/Konqueror/)
    	{
    		$browser="Konqueror";
    	}
    	elsif ($ENV{'HTTP_USER_AGENT'} =~ m/WebTV/)
    	{
    		$browser="WebTV";
    	}
    	elsif ($ENV{'HTTP_USER_AGENT'} =~ m/Lynx/)
    	{
    		$browser="Lynx";
    	}
    	else
    	{
    		$browser="Other";
    	}
    }
    Je déclare la variable $browser avec our pour que celle-ci soit accessible hors du module.

    Concernant ton exemple de code, il est parfait

    Merki

  4. #4
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    J'ai une petite question en passant:

    Je souhaiterai afficher les informations des navigateurs dans un tableau comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ----------------------
    Name    | Number          
    ----------------------
    Firefox | 2
    ----------------------
    MSIE    | 1                    
    ----------------------
    J'ai trouvé une solution mais pas très propre mais qui fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    print "<table border=1>";
    foreach my $browser (keys(%browser_report))
    {
    print "<TR><Td>$browser :</td><Td>$browser_report{$browser}</td></TR>";
    }
    print "</table>";
    Je souhaiterai utiliser la même méthode mais pour un tableau en CGI:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    print $cgi->table({-border=>1},
          $cgi->Tr({},
                [
                  th([$browser]).td([$browser_report{$browser}])
                ]
               )
             );
    Je ne trouve pas la solution. Avec le foreach (non représenté ici), j'obtiens une erreur de syntaxte

    Merci

  5. #5
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    Quel est le message d'erreur? Pourrais-tu montrer ton code, s'il te plait?


    Merci,

    Jasmine,

  6. #6
    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 : 498 771
    Points
    498 771
    Par défaut
    tu peux aussi utiliser la balise pre de html

  7. #7
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    La balise pre et cela te fait rire

    Pour répondre à la question de Jasmine. Con comme je suis, le code ressemblait au départ à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    print $cgi->table({-border=>1},
          $cgi->Tr({},
                [
                   foreach my $browser (keys(%browser_report))
                  {
                     th([$browser]),
                     td([$browser_report{$browser}])
                  } 
               ]
               )
             );
    Je crois plutôt que tu veux m'humilier en public n'est-ce pas ?

    Chez moi, j'écris comme je pense et pourtant j'ai écris un algo

    Si tu as une idée sur la question, je suis preneur.

    Merci d'avance

  8. #8
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Oui, je comprends mieux le pourquoi du if. J'étais pas bien réveillé.
    Citation Envoyé par Olivier Regnier Voir le message
    Concernant ton exemple de code, il est parfait
    Nope Déjà, j'ai au moins utilisé cinq caractères de trop.
    J'ai écrit my $browser=(split /\s/)[1]; alors que j'aurais pu me contenter de my $browser=(split)[1]; En effet, découper par les blancs est le comportement par défaut de split.

    Et pour ton nouveau problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    print $cgi->table({-border=>1},
          $cgi->Tr({},
                [
                  th([$browser]).td([$browser_report{$browser}])
                ]
               )
             );
    Euh, je connais mal le module CGI, mais si j'ai bien compris ce que j'ai lu à ce sujet, je me demande si c'est normal que ce soit un point devant td et pas une virgule.

  9. #9
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Bonjour Schmorgluck
    Découper par les blancs est le comportement par défaut de split.
    Et moi comme un idiot, j'ai recopier bêtement sans vérifier
    Euh, je connais mal le module CGI, mais si j'ai bien compris ce que j'ai lu à ce sujet, je me demande si c'est normal que ce soit un point devant td et pas une virgule.
    J'ai vérifié dans la documentation du module CGI et effectivement, c'est une virgule et non un point. Bien vu

    J'ai testé de nouveau mon fameux tableau.

    Test n°1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach my $browser (keys(%browser_report))
    {
       print $cgi->table({-border=>1},
                       Tr(th([$browser]),td([$browser_report{$browser}])));
    }
    Comme je pouvais m'y attendre, cela génère deux tableaux, l'un avec le navigateur Firefox et le second MSIE.

    Test n°2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    print $cgi->table({-border=>1},
        foreach my $browser (keys(%browser_report))
        {
             Tr(th([$browser]),td([$browser_report{$browser}])));
        }
    print $cgi->end_table();
    J'obtiens de nouveau ce message suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Software error:
     
    syntax error at stats.cgi line 176, near "foreach "
    Execution of stats.cgi aborted due to compilation errors.
    Je ne sais pas du tout comment rectifier cette erreur

    Merci

  10. #10
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    C'est parce que tu essaie d'utiliser une instruction à l'intérieur d'une expression...
    Ici, il faut utiliser une expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    print table({-border=>1},
      Tr({}, [ 
        th(['Name', 'Number']),
        map { td([ $_, $browser_report{$_} ]) } keys %browser_report 
      ])
    );
    --
    Jedaï

  11. #11
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Citation Envoyé par Jedai
    C'est parce que tu essaie d'utiliser une instruction à l'intérieur d'une expression...
    Ici, il faut utiliser une expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    print table({-border=>1},
      Tr({}, [ 
        th(['Name', 'Number']),
        map { td([ $_, $browser_report{$_} ]) } keys %browser_report 
      ])
    );
    Il va falloir que je consulte à fond la doc

    J'ai testé ce code et c'est impec, merci

  12. #12
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    J'essaye depuis quelques instants d'afficher tout le contenu de mon fichier log dans un tableau.
    Le fichier se présente en colonnes sépraré par un espace.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    element1 element2 element3 ...
    J'ai donc repris le code de Jedai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    open my ($in), $logstats;
        my %log_report;
        while (<$in>)
        {
        	my $all=(split /\s/)[0];
        	$log_report{$all}++;
        }
    close ($in);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    print $cgi->h2('Logfile');
    print $cgi->table({-border=>1},
      Tr({}, [
         th(['IP', 'Hostname', 'OS', 'Browser', 'Languages', 'Date', 'Time']),
         map { td([$_]) } keys %log_report
      ])
    );
    Si j'insère 7 $_ à coté du td, j'obtiens 7 fois l'adresse ip mais je ne sais pas comment traiter le fichier d'un coup

    Merci

  13. #13
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Je ne comprends pas bien pourquoi tu appelles $all une variable qui ne reçoit que la première colonne d'une ligne du fichier. D'autre part, si tu veux afficher le contenu du fichier en html, faudrait peut-être le garder quelque part en mémoire pour le traiter, non ? Parce que là, tu ne fais pas ça, tu te contentes de compter les occurences des IP.
    Perso, je proposerais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    open my ($in), $logstats;
        my %log_report;
        my @lines;
        while (<$in>)
        {
            push @lines, [split];
        	my $all=(split /\s/)[0];
        	$log_report{$all}++;
        }
    close ($in);
    J'ai laissé %log_report, mais je ne sais pas ce que tu veux en faire.
    Le tableau @lines contenant les références de tableaux d'éléments du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    print $cgi->h2('Logfile');
    print $cgi->table({-border=>1},
      Tr({}, [
         th(['IP', 'Hostname', 'OS', 'Browser', 'Languages', 'Date', 'Time']),
         map { td($_) } @lines
      ])
    );
    Je crois que ça devrait marcher.

  14. #14
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    J'ai tenté de reprendre l'exemple de Jedai mais je me suis mêler les pinceaux. Je viens de tester tes modifications et je te dis

    Merci beaucoup

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

Discussions similaires

  1. Compter le nombre de ligne dans un fichier text
    Par nekcorp dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/06/2018, 14h10
  2. [Smarty] Compter le nombre d'éléments dans un Array Smarty
    Par Dionyzos dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 10/02/2010, 12h29
  3. Compter le nombre de ligne dans un fichier
    Par amine_en_france dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 31/05/2007, 17h19
  4. Compter le nombre d'élément dans un tableau
    Par cryptorchild dans le forum Langage
    Réponses: 6
    Dernier message: 08/07/2005, 13h01
  5. Réponses: 2
    Dernier message: 02/03/2004, 19h38

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