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 :

Parser de texte: extraction de valeurs


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Points : 26
    Points
    26
    Par défaut Parser de texte: extraction de valeurs
    Bonjour,

    J'ai un fichier texte de ce type:

    : 21967 [DATA] 21:03:53:402 2012/10/08 MODULE_TEST FILTRAGE_VERIFICATION
    Parameter --> Len = 44, Addr = 0xF09704BC
    data = (structure)
    reference_counter = 1
    msg_length = 44
    value_filtrage = -105

    le fichier contient le meme type de message et contents indiqué [DATA].
    A chaque fois que je détecte [DATA], je souhaite récupérer dans un fichier de sorti txt: la date;time, et value_filtrage

    comme ceci:
    date;time;value_filtrage
    2012/10/08;21:03:53:402;-105



    Pour le moment j'arrive à extraire le value_filtrage mais pas la date et l'heure. Auriez-vous des suggestions? j'attache mon bout de code en pièce jointe.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre régulier
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Décembre 2012
    Messages : 43
    Points : 91
    Points
    91
    Par défaut
    plutôt que d'utiliser des expressions régulières, tu pourrais utiliser la fonction split :

    (à tester)
    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
    #!/usr/bin/perl
     
    use strict;
    use Win32::OLE;
    use Win32::OLE::Variant;
     
     
    # Global variables
    my $nb_fileIN_line = 0;
    my $file_in = shift;
    my $file_out = shift;
    my $line;
     
    my $count_line = 0;
     
    # Open Log File
    open FILE_IN, $file_in 
         or die("cannot open $file_in");
     
    # Open Log File parsed
    open FILE_OUT, ">" . $file_out 
    	 or die("cannot open $file_out for writing");
     
     
    my ( $doubleDot, $refId, $dataString, $time, $date, $module, $filter );
    my ( $stringValue, $value );
    # read Input file line by line
    while ($line = <FILE_IN>){
    	chomp( $line ); #suppression du saut de ligne
     
    	if ($line =~ /\[DATA\]/) {
    		( $doubleDot, $refId, $dataString, $time, $date, $module, $filter ) = split( / /, $line);
    		print FILE_OUT $date.";".$time.";";
    	}
    	if($line =~ /value_filtrage/) {
    		( $stringValue, $value ) = split( /=/, $line);
    		print FILE_OUT $value."\n";
    	}
    }
     
    close FILE_IN;
    close FILE_OUT;
    sinon, pour le problème d'extraction de la date et l'heure, tu t'es trompé dans l'utilisation du nom d'une variable (ligne 29).
    Saaaaluuut Nounou!!

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    je viens d'essayer le bout de code. time et date ne s'affiche pas dans le fichier de sortie.

    En ce qui concerne les valeurs elles ne sont pas toutes présentes. j'ai utilisé les expressions régulières de cette manière avec /i

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($line =~ /value_filtrage = (\-?\d+)/i)
    car parfois dans mon log de sortie j'ai "value_filtrage" ou "value_Filtrage" capital "F".

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    essaie ce code, en rouge la partie modifiée par rapport à ton code

    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
    #!/usr/bin/perl
    
    use strict;
    use Win32::OLE;
    use Win32::OLE::Variant;
    
    
    # Global variables
    my $nb_fileIN_line = 0;
    my $file_in = shift;
    my $file_out = shift;
    my $line;
    my $timeDate;
    my $l;
    my $count_line = 0;
    
    # Open Log File
    open FILE_IN, $file_in 
         or die("cannot open $file_in");
    
    # Open Log File parsed
    open FILE_OUT, ">" . $file_out 
    	 or die("cannot open $file_out for writing");
    
    # read Input file line by line
    while ($line = <FILE_IN>){
    	
    	
    	if ($l =~ #\[DATA\]\s*(\d{2}:\d{2}:\d{2}:\d{3}\s+\d{4}/\d{2}/\d{2})#){
                    $timeDate = $1;
    		printf FILE_OUT "$timeDate";
    	}
    	elsif($line =~ /value_filtrage = (\-?\d+)/i) {
    		printf FILE_OUT "%d\n", $1;		
    	}
    }
    
    close FILE_IN;
    close FILE_OUT;

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Décembre 2012
    Messages : 43
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par jemigo Voir le message
    Bonjour,

    je viens d'essayer le bout de code. time et date ne s'affiche pas dans le fichier de sortie.
    il est possible que ça vienne de la regex envoyé à la fonction split.
    Comme je l'ai marqué, le code n'a pas été testé.
    Peut être qu'en remplaçant / / par " ", le code pourrait fonctionner.
    Saaaaluuut Nounou!!

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour, ça tient en 5 lignes de code utile.

    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    my ($time, $date);
    while (<DATA>) {
    	chomp;
    	($time, $date) = (split /\s+/, $_)[3,4] if /\[DATA\]/;
    	print "$date $time $1 \n" if m/^value_filtrage =\s+([+-]?\s?\d+)/;
    }
     
    __DATA__
    : 21967 [DATA] 21:03:53:402 2012/10/08 MODULE_TEST FILTRAGE_VERIFICATION
    Parameter --> Len = 44, Addr = 0xF09704BC
    data = (structure)
    reference_counter = 1
    msg_length = 44
    value_filtrage = -105
    : 21967 [DATA] 21:03:53:402 2012/11/08 MODULE_TEST FILTRAGE_VERIFICATION
    Parameter --> Len = 44, Addr = 0xF09704BC
    data = (structure)
    reference_counter = 1
    msg_length = 44
    value_filtrage = -104
    : 21967 [DATA] 21:03:53:402 2012/12/08 MODULE_TEST FILTRAGE_VERIFICATION
    Parameter --> Len = 44, Addr = 0xF09704BC
    data = (structure)
    reference_counter = 1
    msg_length = 44
    value_filtrage = -103
    Ce qui me donne l'affichage suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ perl  parser.pl
    2012/10/08 21:03:53:402 -105
    2012/11/08 21:03:53:402 -104
    2012/12/08 21:03:53:402 -103

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Points : 26
    Points
    26
    Par défaut
    Bonjour,
    Merci pour votre aide. j'ai opté pour la dernière solution. j'ai adapté le code de façon a récupérer date et time dans deux variables différentes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while ($line = <FILE_IN>){
     if ($line =~ /\[Primitive\]\s*(\d{2}:\d{2}:\d{2}:\d{3})\s+(\d{4}\/\d{2}\/\d{2})/){
        $time = $1;
    	$date = $2;
     }
     elsif($line =~ /serving_power_in_quarter_dBm = (\-?\d+)/i) {
     printf FILE_OUT "%s;%s;%s\n", $date , $time, $1;
     }
    }
    Ca fonctionne parfaitement! Merci.

    Sujet Résolu!

  8. #8
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Le code que j'avais présenté récupérait date et time dans deux variables différentes (ce qui permettait de les imprimer dans l'ordre inverse de leur apparition dans le fichier en entrée).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf FILE_OUT "%s;%s;%s\n", $date , $time, $1;
    Dans ce genre de cas, il est généralement préférable d'employer la fonction print plus simple et plus rapide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf FILE_OUT "$date;$time;$1\n";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf FILE_OUT join ";", $date , $time, "$1\n";
    Ou éventuellement la fonction say qui ajoute automatiquement un retour à la ligne au dernier de ses arguments, si tu utilises une version de Perl la possédant (sauf erreur, à partir de 5.10).

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 30/11/2006, 23h06
  2. parser fichier texte pour avoir un doc html !!
    Par avogadro dans le forum Débuter
    Réponses: 4
    Dernier message: 30/03/2006, 16h12
  3. Extraction des valeurs hexa d'un champ char
    Par Krispi dans le forum Fortran
    Réponses: 3
    Dernier message: 21/11/2005, 11h10
  4. [Tableaux] Extraction de valeur dans un tableau
    Par pirouette_07 dans le forum Langage
    Réponses: 6
    Dernier message: 21/10/2005, 17h54
  5. [Pb : champ Text = pas de valeur par defaut ?]
    Par mat_dum dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 18/08/2003, 12h57

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