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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    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
    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 chevronné
    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
    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
    Membre expérimenté

    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
    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
    Membre expérimenté

    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
    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 éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    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 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    tu peux aussi utiliser la balise pre de html

  7. #7
    Membre chevronné
    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
    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.

  8. #8
    Membre expérimenté

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

+ 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