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 :

Extraire chaine de caractères


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 Extraire chaine de caractères
    Bonjour,

    Je souhaite extraire des valeurs dans une chaine de caractères d'un fichier txt:


    "04-08 09:36:40.589578 1570 1836 I use-Rlog/RLOG-GSM: getLTELevel - rsrp:-119 snr:-12 rsrpIconLevel:0 snrIconLevel:1"


    Quand la chaine de caractères "getLTELevel est détectée, je récupère la date, l'heure, et les valeurs rsrp et snr sous la forme suivante dans un fichier texte.

    04-08;09:36:40.589578;-119;-12

    J'ai effectué simplement un script bash comme ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #!/bin/sh
     
    OUT=$1.csv
     
    echo "date, time, rsrp, snr" > $OUT
    grep getLTELevel radio_log | grep rsrp | awk '{ print $1 ", " $2 ", " $9 ", " $10 }' | sed -e 's#rsrp:##' -e 's#snr:##' >> $OUT
    Cependant, je souhaite le faire également en Perl. J'ai essayé comme ci-dessous mais je dois pas avoir mis les bonnes expressions régulières.

    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 $time;
    my $date;
     
    # 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");
     
    printf FILE_OUT "Date;Time;rsrp;snr\n";  
     
    # read Input file line by line
    while ($line = <FILE_IN>){
     if ($line =~ /\[getLTELevel\]\s*(\d{2}:\d{2}:\d{2}:\d{3})\s+(\d{4}\/\d{2}\/\d{2})/){
        $time = $1;
    	$date = $2;
     }
     
      printf FILE_OUT "%s;%s;%s;%d\n", $date , $time, $1;
     
     }
     
    close FILE_IN;
    close FILE_OUT;
    Auriez-vous des idées s'il vous plaît?

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut
    Bonjour,

    le code suivant récupére ce que tu cherches.
    /x permet d'aérer l'écriture de la regex pour la rendre plus lisible :
    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
    #!/usr/bin/env perl
    use warnings;
    use strict;
    use feature 'say';
     
    while (<DATA>) {
       chomp;
       if ( $_ =~ /^(\d+\-\d+)
                    \s+
                    (\d{2}:\d{2}:\d{2}\.\d+)
                    \s+
                    .*
                    getLTELevel
                    .*
                    rsrp:(.\d+)
                    \s+
                    snr:(.\d+)
                    \s+
                  /x
              )
              {
                  say join ';', ( $1, $2, $3, $4 ) ;
              }
    }
    __DATA__
    04-08 09:36:40.589578 1570 1836 I use-Rlog/RLOG-GSM: getLTELevel - rsrp:-119 snr:-12 rsrpIconLevel:0 snrIconLevel:1
    Sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $ ./test_regex.pl
    04-08;09:36:40.589578;-119;-12

  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 te remercie. cependant, j'ai plusieurs lignes dans mon fichier donc la variable DATA sera différente à chaque ligne.

    Ca marche dans ce cas là en dur.

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut
    Citation Envoyé par jemigo Voir le message
    Bonjour,

    Je te remercie. cependant, j'ai plusieurs lignes dans mon fichier donc la variable DATA sera différente à chaque ligne.

    Ca marche dans ce cas là en dur.
    C'est juste pour l'exemple, DATA représente un fichier pouvant contenir n lignes, embarqué dans ton code
    Tu récupères juste la partie regex pour l'implémenter dans ton code.

  5. #5
    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,

    Ca fonctionne. Merci beaucoup. Code final:

    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
    #!/usr/bin/perl
     
    use strict;
    use Win32::OLE;
    use Win32::OLE::Variant;
    use feature 'say';
     
    # Global variables
    my $nb_fileIN_line = 0;
    my $file_in = shift;
    my $file_out = shift;
    my $line;
    my $time;
    my $date;
     
    # 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");
     
    printf FILE_OUT "Date;Time;RSRP;SNR\n";  
     
    # read Input file line by line
    while ($line = <FILE_IN>){
       if ($line =~ /^(\d+\-\d+)\s+(\d{2}:\d{2}:\d{2}\.\d+)\s+.*getLTELevel.*rsrp:(.\d+)\s+snr:(.\d+)\s+/x){
    		$time = $1;
    	    $date = $2;
    		printf FILE_OUT "%s;%s;%s;%d\n", $time , $date, $3, $4;
    	}
     
    }
     
     
    close FILE_IN;
    close FILE_OUT;

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

Discussions similaires

  1. Extraire chaine de caractère grace a un logiciel.
    Par heartcrusher dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 26/06/2012, 10h00
  2. Extraire chaine de caractères BATCH ou AWK
    Par LuffyyffuL dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 07/02/2011, 20h02
  3. extraire chaine de caractère
    Par dyngry dans le forum Langage
    Réponses: 2
    Dernier message: 05/08/2010, 17h30
  4. Extraire chaine de caractère
    Par pavinho dans le forum SAS Base
    Réponses: 3
    Dernier message: 24/07/2009, 10h07
  5. Extraire chaine de caractère dans chaîne de caratère
    Par kornichon dans le forum Langage
    Réponses: 9
    Dernier message: 11/07/2007, 21h56

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