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 :

[Débutant] Parsing fichier log


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Par défaut [Débutant] Parsing fichier log
    Bonjour,

    Je suis débutant en perl.

    J'ai un soucis un peu similaire à Flo.

    J'ai un fichier de log FTP avec chaque champs délimité par des crochets.

    C'est à peu près du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [date] [domaine] [protocole] [username] [ip] [commande] [FilePath] [FileSize]
    Je voudrais pouvoir parcourir le fichier de log, et pour chaque ligne, affecter les valeurs des 8 champs (sans les crochets) dans un tableau.

    Si les valeurs étaient séparées par des virgules, j'aurai utilisé la fonction split.
    Mais là avec les crochets je ne vois pas trop comment faire.
    A moins d'utiliser la fonction split et que le séparateur des champs soit '] ['

    J'ai bien lu la réponse de vic, mais j'ai un peu du mal à comprendre si cette solution pourrait s'appliquer à mon cas, où s'il y en a une autre qui serait mieux adaptée.

    Merci pour votre aide précieuse.

  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
    Je ne suis pas sûr que remonter un sujet vieux de plus de huit ans était la meilleure façon de procéder, enfin bon...

    Pour résoudre ton problème, il suffit d'utiliser l'opérateur de reconnaissance de regex en contexte de liste et avec le modificateur /g, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @champs= $ligne=~/\[([^\]])\]/g;
    Toutes les parties reconnues entre les parenthèses capturantes sont retournées sous la forme d'une liste, qui est donc affectée au tableau @champ.

    Pour être complet, s'il n'y avait pas de parenthèses capturantes, ce seraient toutes les reconnaissances qui seraient renvoyées, crochets compris. Ici, on profite des parenthèses pour écarter les crochets.

  3. #3
    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
    Bon, la regex que j'ai utilisée ne semble pas très claire présentée comme ça. En plus, il y a une erreur dedans (j'ai oublié le quantificateur +). Voici une version corrigée, ainsi qu'indentée et commentée au moyen du modificateur /x.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /
      \[         # crochet ouvrant échappé, correspondant au crochet ouvrant du texte à reconnaître.
        (        # ouverture de la paire de parenthèses capturantes.
          [^\]]+ # classe de caractère complémentée, contenant le caractère ']' échappé.
                 # autrement dit, cette classe de caractère reconnait tout sauf un caractère ']'
        )        # fermeture de la paire de parenthèses capturantes.
      \]         # crochet fermant échappé, correspondant au crochet fermant du texte à reconnaître.
    /gx

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Par défaut
    Merci infiniment pour ta réponse Schmorgluck.

    C'est balaise.

    J'ai à peu près compris le début mais quand j'ai vu ça : [^\]]+
    Je suis resté comme une blonde devant un bouquin de physique/chimie.

    Dailleurs je n'ai pas encore bien repris mes esprits.

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Une autre manière d'écrire la regexp (à priori, elle matche les mêmes choses) est d'utiliser le quantifieur "non greedy" (non gourmand) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @champs= $ligne=~/\[(.*?)\]/g;
    ce qui produit une regexp plus facile à lire.
    La regexp recherche un [ , puis une chaine quelconque aussi courte possible qui est suivie d'un ]. Ainsi, en utilisant le quantifieur *?, on peut être certain que le premier ] trouvé terminera la chaine quelconque.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Par défaut
    Merci beaucoup Philou, c'est effectivement davantage intelligible pour moi.

    Merci à vous deux (Philou et Schmorgluck) pour votre aide précieuse.

Discussions similaires

  1. Parsing d'un fichier log
    Par taieb84 dans le forum Logging
    Réponses: 0
    Dernier message: 14/03/2011, 11h10
  2. Débutant parsing fichier XML
    Par jameson dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 28/11/2010, 17h26
  3. Réponses: 4
    Dernier message: 19/07/2007, 18h02
  4. [débutant]Comment faire des fichiers log
    Par smutmutant2003 dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 12/06/2007, 15h39
  5. [] [Stratégie] Comment créer un fichier log
    Par Skeezo dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 16/09/2002, 18h30

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