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

Modules Perl Discussion :

récupérer mots dans un fichier puis enregistrer en un .xls (débutant) help!


Sujet :

Modules Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut récupérer mots dans un fichier puis enregistrer en un .xls (débutant) help!
    Voilà, je débute en perl et j’ai écrit un petit programme qui consiste à se connecter à un logiciel, d’effectuer un script puis qui enregistre les données en un fichier.log. Jusqu’ici, tout va bien, mais j’aimerais récupérer tous les mots « connected » et « disabled » du fichier et les enregistrer en un fichier.xls ou .csv afin de pouvoir compter ensuite le nombre de mots « connected » par rapport au nombre de mots « disabled »…

    Voici le fichier.log concerné grosso modo :

    Port Name Status Vlan Duplex Speed Type
    Gi1/0/12 CDCRT02STD_RH (2 / connected 3126 full 100
    Gi1/0/13 CDCRS02STD_RH (2 / connected 3126 full 100
    Gi1/0/14 CDCRT01STD_RH (2 / connected 3126 full 100
    Gi1/0/15 CDCRS01STD_RH (2 / connected 3126 full 100
    Gi1/0/16 CWSFT03L02_RH (2 / connected 1495 full 100
    Gi1/0/17 - (3 / 1 / 1) disabled 999 full 100 10/10
    Gi1/0/18 - (3 / 2 / 1) disabled 999 full 100 10/100



    Merci pour les aides, je commence à perdre patience !!!!!

  2. #2
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    euhh...pourquoi vouloir les enregistrer dans un fichier autre alors que perl peut les compter pour toi en utilisant la recherche d'expressions régulières et un compteur par exemple?

  3. #3
    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
    t'as pas forcement besoin de passer par un fichier excel ou csv pour compter le nombre de mots qui t'interesse . C'est faisble directement dans ton script.
    Quant à la generation des fichiers excel regarder coté CPAN, y a des modules pour, tel : Spreadsheet::WriteExcel

    Sinon regarde les snippets (accueil du forum perl), j'avais déjà mis un code permettant de passer d'un fichier txt, csv à un fichier excel.

    Voilà, bon courage

  4. #4
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut merci
    merci de vos réponses, je m'y mets et vous tiens au courant, c'est pas gagné avec mon niveau de prog

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut compteur?
    Voici un bout du code qui est censé me permettre de compter le nombre de fois que le mot "connected" est affiché:

    open (port_file, "port_$my_switch_name.log") || die "Cannot open the $port_my_switch_name!";
    #open(FILE,"<$filename>") or die "open: $!";

    my($line,@words,$word,%total);
    while( defined( $line = <port_file>) )
    {
    @words = split( /\W+/, $line);
    foreach $word (@words)
    {
    $mot =~ tr/A-Z/a-z/;
    $total{$word}++;
    }
    }
    close(port_file);

    foreach $word (sort keys %total)
    {
    print "$word a ete rencontre $total{$word} fois.\n";
    }

    mais au lieu de ça il me génère des erreurs et m'affiche tous les mots, exemple:
    "trunk a ete rencontre 6 fois
    vlan a ete rencontre 8 fois ..." etc.

    j'ai bien mis au début:
    $word='connected';

    Pouvez-vous m'aider? je débute et ça se voit

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par loukoulouk
    Voici un bout du code qui est censé me permettre de compter le nombre de fois que le mot "connected" est affiché:

    open (port_file, "port_$my_switch_name.log") || die "Cannot open the $port_my_switch_name!";
    #open(FILE,"<$filename>") or die "open: $!";

    my($line,@words,$word,%total);
    while( defined( $line = <port_file>) )
    {
    @words = split( /\W+/, $line);
    foreach $word (@words)
    {
    $mot =~ tr/A-Z/a-z/;
    $total{$word}++;
    }
    }
    close(port_file);

    foreach $word (sort keys %total)
    {
    print "$word a ete rencontre $total{$word} fois.\n";
    }

    mais au lieu de ça il me génère des erreurs et m'affiche tous les mots, exemple:
    "trunk a ete rencontre 6 fois
    vlan a ete rencontre 8 fois ..." etc.

    j'ai bien mis au début:
    $word='connected';

    Pouvez-vous m'aider? je débute et ça se voit

    Bonjour, jeune apprenti

    Non, le code que tu nous montres ne sert pas à compter le nombre de fois que la chaîne "connected" a été trouvé, il sert justement à compter le nombre de fois que chaque mot trouvé a été repéré. Et pour ça, il fait bien son travail

    Essaie de remplacer ton foreach de ta boucle while par le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach $word (@words)
     {
       $total{$word}++ if ($word =~ /connected/i);
     }
    Comme tu ne cherches que la chaîne "connected" (je suppose qu'elle peut être en minuscule ou majuscule ?), tu n'as qu'à compter uniquement lorsque le script trouve cette chaine de caractères.


  7. #7
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    ton $word est réutilisé, il ne vaut plus 'connected' dans ton script, il prend la valeur de chaque mot composant chaque ligne. :
    est-ce que tu as mis use strict en début de ton prog?
    je doute sinon il t'aurait signalé une erreur et tu l'aurais corrigée tout seul!!!

    moi je ferai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    my $connected = 'connected';
    my $disconnected = 'disabled';
    while( defined( $line = <port_file>) )
    {
       #recherche le mot connected ou disables dans la ligne
       if ($line =~ /($connected|$disconnected)/i)
       {
           #$1 contient la valeur du mot qui a été repéré dans la ligne
           $total{$1}++;
       }
    }
    je n'ai pas vérifié le code, mais ça te donne une piste

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut merci
    Citation Envoyé par Arioch
    Bonjour, jeune apprenti

    Non, le code que tu nous montres ne sert pas à compter le nombre de fois que la chaîne "connected" a été trouvé, il sert justement à compter le nombre de fois que chaque mot trouvé a été repéré. Et pour ça, il fait bien son travail

    Essaie de remplacer ton foreach de ta boucle while par le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach $word (@words)
     {
       $total{$word}++ if ($word =~ /connected/i);
     }
    Comme tu ne cherches que la chaîne "connected" (je suppose qu'elle peut être en minuscule ou majuscule ?), tu n'as qu'à compter uniquement lorsque le script trouve cette chaine de caractères.


    MDR
    ça marche
    Encore merci, ça avaaaaaance!!!

  9. #9
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    2 p'tites secondes, je remanie ton code

  10. #10
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    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
     
    open (port_file, "port_$my_switch_name.log") || die "Cannot open the $port_my_switch_name!";
    while(<port_file>)
    {
        @words = split( /\W+/, $_);
        @words =~ tr/A-Z/a-z/;
        foreach $word (@words)
        {
            ++$total{$word} if ($word =~ /(connected|disabled)/);
        }
    }
    close(port_file);
     
    foreach (sort keys %total)
    {
        print "$_ a ete rencontre $total{$_} fois.\n";
    }

  11. #11
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut ok
    Citation Envoyé par Arioch
    2 p'tites secondes, je remanie ton code

  12. #12
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut voilà ce que j'ai maintenant
    open (port_file, "port_$my_switch_name.log") || die "Cannot open the $port_file:$!";

    my($line,@words,$word,%total);
    while( defined( $line = <port_file>) )
    {
    @words = split( /\W+/, $line);
    foreach $word (@words)
    {
    $total{$word}++ if ($word =~ /connected/i);
    $total {$word}++ if ($word =~ /disabled/i);
    }
    }
    close(port_file);

    foreach $word (sort keys %total)
    {

    print " Il y a $total{$word} ports $word dans $my_switch_name.\n";
    }

    Ce qui me donne bien: "il y a 19 ports connected dans...." et "il y a bien 2 ports disabled dans..."

    Maintenant, comment enregistrer ces 2 phrases dans un fichier (txt ou xls)?

    En fait, mon script va se connecter à chaque dispositif un à un et écrire à chaque fois le nombre de ports connectés et disabled, j'aimerais mettre à la suite ces phrases dans un seul fichier, comment faire???
    (je sais pas si j'ai été claire là.... )

  13. #13
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    moi je dirais : lis un peu de doc Perl avant de poser ce genre de question.
    J'imagine que cette réponse doit être dans la FAQ perl de ce site : écrire dans un fichier.
    bon courage

  14. #14
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par loukoulouk
    Maintenant, comment enregistrer ces 2 phrases dans un fichier (txt ou xls)?

    En fait, mon script va se connecter à chaque dispositif un à un et écrire à chaque fois le nombre de ports connectés et disabled, j'aimerais mettre à la suite ces phrases dans un seul fichier, comment faire???
    (je sais pas si j'ai été claire là.... )
    Je te recommanderai bien un fichier au format CSV qui a l'avantage d'être ouvert et lisible depuis Excel. Tu pourras toujours l'enregistrer par la suite au format XLS.

    Le CSV est un fichier texte classique dans lequel tu écriras tes résultats.

    Exemple de ligne : "result1;result2;result3;result4"

    Sous Excel, tu auras pour cette ligne 4 colonnes. Le séparateur à utiliser est le ;

    Bon courage

  15. #15
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Points : 1 491
    Points
    1 491
    Par défaut
    je te conseille de lire la section Fichiers de la FAQ ..
    tu y trouveras la majorité des réponses à tes questions sur le traitement des fichiers en Perl!
    Cela demande du courage d'en tirer du plaisir
    Quand on n'a qu'un marteau, tous les problèmes ressemblent à un clou

  16. #16
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut merci
    Citation Envoyé par stoyak
    je te conseille de lire la section Fichiers de la FAQ ..
    tu y trouveras la majorité des réponses à tes questions sur le traitement des fichiers en Perl!
    Merci je vais voir ça...

    Mais je n'ai pas de pb à créer un fichier ou à écrire dedans, c'est juste qu'à chaque dipositif auquel je me connecte j'aimerais enregistrer les données à la suite dans un même fichier (et non pas créer un nouveau fichier à chaque fois que je me connecte à un nouveau dispositif...)

    Ok je vais lire les FAQ

  17. #17
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Voilà mon problème, c'est qu'à chaque fois que j'enregistre les données d'un nouveau dispositif, celles-ci écrasent les anciennes données alors que ce que je veux c'est qu'elles soient enregistrées à la suite.

    Par exemple, dans un fichier.txt il y a écrit: "il y a 5 pommes". Je fais tourner mon programme qui compte 8 pommes, j'enregistre dans le même fichier.txt "Il ya 8 pommes". J'aimerais avoir dans le fichier:
    Il y a 5 pommes.
    Il y a 8 pommes.
    Et ainsi de suite.
    Au lieu de ça, je n'ai qu'une phrase: "il y a 8 pommes".

    Comment faire?

  18. #18
    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
    faut faire >> et non > pour ne pas ecraser mais ecrire à la suite.
    quand tu fais open (FILE, ">>mon_fichier");

  19. #19
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par djibril
    faut faire >> et non > pour ne pas ecraser mais ecrire à la suite.
    quand tu fais open (FILE, ">>mon_fichier");

    Oui merci j'avais repéré l'erreur en fin de journée

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

Discussions similaires

  1. Récupérer des mots dans un fichier html
    Par neterfari dans le forum C++/CLI
    Réponses: 5
    Dernier message: 03/04/2014, 09h49
  2. Récupérer un mot dans un fichier
    Par John_Locke_42 dans le forum Ada
    Réponses: 4
    Dernier message: 16/04/2011, 12h22
  3. Réponses: 1
    Dernier message: 18/01/2009, 09h34
  4. récupérer un mot dans un fichier txt
    Par thedevil dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/05/2007, 14h59
  5. Comment changer des mots dans un fichier?
    Par ptitbonum dans le forum Linux
    Réponses: 5
    Dernier message: 07/04/2004, 23h42

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