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 :

Expression régulière quelconque


Sujet :

Langage Perl

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Par défaut Expression régulière quelconque
    Bonjour,
    on en finira jamais avec ces regexp! Je n'ai malheureusement pas trouvé la réponse en fouillant le site.

    Voilà mon problème, j'ai envie de capturer des expressions dont j'ignore exactement comment elles s'écrivent. Elles reviennent parfois
    toujours pas à la même position, en règle générale entre parenthèses, mais pas toujours.
    La seule information qui matche partout, ces expressions (des fonctions) sont toujours composées de
    - majuscules,
    - "_" (underscore)
    - parfois à la fin un nombre

    donc du type: XX_XYY_....._ZZ_1

    Exemple: DT_PT_1

    deux exemple de ligne où je veux capturer cette fonction:

    FRAME NAME: DriveTrainData1_A Daten Antriebsstrang 1 (DT_PT_1, internal Gateway FA-CAN)
    FRAME NAME: DriveTrainData1_FA Daten Antriebsstrang 1 (DT_PT_1)

    Quelqu'un aurait-il une idée?

  2. #2
    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
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Peut-être ceci:

    Ou alors, peut-être mieux:


  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Par défaut
    en fait je les avais déjà essayées, tes deux expressions, sans succès. c'est peut-être mieux avec mon bout de code et surtout la description complète du problème:

    1- Je voudrais parser le document par bloc (entre les délimiteurs = /FRAME NAME/../FRAME NAME/)
    2- au passage capturer le nom de la trame figurant dans la ligne avec entête "FRAME NAME.
    * le nom n'est pas connu d'avance
    * il n'est pas souvent à la même position
    * il est très souvent entre parenthèse (j'en ai vu entre crochets, voir le bloc 2 de l'exemple du fichier *.txt joint)
    * il n'est formé que de majuscules, underscores ("_"), parfois un nombre à la fin

    l'analyse du doc entre les délimiteurs je pourrais le faire. Le plus important est de délimiter et capturer les noms.
    dans le doc word j'ai mis en rouge des exemples de noms à relever.

    voici le début de mon 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    use warnings;
    use constant SCRIPT_NAME => "Patch Mapping_CAN_FR.pl";
    use constant SCRIPT_VERSION => "1.0";
     
    my $ScrDIR = $ARGV[0]; 
    my $out_dir = $ARGV[1];
    my $flag = 0;
    my $frame = '';
    my $line;
    my @array;
    my $Count = 0;
     
    #Log_Info("USAGE: " . SCRIPT_NAME." <Source Folder> [<Output folder> optional]" );
     
    #------------Open source file------------	
    my $ScrFile = $ScrDIR."\\test.txt"; #Source document: Frame report list
    my $fhR; 
    open ($fhR, $ScrFile) or die "Unable to open the file $ScrFile\n"; 
    #----------------------------------------
     
    #-------------write file-----------------
    #my $fhWrite = $out_dir."\\patch_mapping-A-FA_CAN".".txt";# Created document: mapping INCA Signal name - Internal signal name
    #open ($out_dir, '>', $fhWrite) or die "Unable to open the file $fhWrite\n";
    #----------------------------------------
     
    while ($line = <$fhR>) #As long as the file fhR contains data, we read the data
    {
     
    	if ($line =~/FRAME NAME:/)
    	{
    		$Count ++;
    		#if ($line =~ /FRAME NAME/ )
    		#{
    			#my $regexp = qr
    				#{
    					#FRAME NAME:\s+.*?([^']\w+)
    				#}x;
    			#$frame = $line =~ $regexp;
    			$frame = $line =~ /(([A-Z]+_)+\d?)/;
     
    		#}
    	 print"my Frame: $frame\n";
     
    	}
     
    }
    print "number of frames = $Count\n";  # combien de fois il retrouve "FRAME NAME" dans le doc
    <>;
    Fichiers attachés Fichiers attachés

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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
    Par défaut
    je m'essaye à une proposition en repartant de 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
    while (<$fhR>) #As long as the file fhR contains data, we read the data
    {
     
            if ($_ =~/FRAME NAME:.*[\(|\[]([A-Z]+_[A-Z]+(?:[_ A-Z 0-9]+)?)[\)|\]]/)
            {
     
                    print"my Frame: $1\n";
     
            }
            else
            {
                    # Traitement de tes autres lignes
            }
    }
    Résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -bash-3.00$ perl test.pl
    my Frame: DT_PT_1
    my Frame: DIAG_OBD_ENG
    my Frame: BN_UVL
    my Frame: ST_COSP_FU_ENG
    my Frame: TORQ_CRSH_3
    my Frame: WMOM_DRV_1
    ça me semble correcte en travaillant avec ton fichier txt

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Par défaut
    Bonjour 6ril23 et merci pour ta Regexp,

    j'ai actualisé le fichier texte en pièce jointe. Dans le dernier bloc il y a la fonction DT_PT_1 qui revient
    et j'aimerais la choper aussi. Donc dans le résultat on devrait la voir 2 fois. comment étendre la Regexp?

    la deuxième question c'est, si je travaille par bloc avec délimiteurs, alors je ne peux plus extraire les fonctions (vu qu'elle
    sont contenues dans les lignes portant les délimiteurs.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while ($line = <$fhR>)
    {
        if (/FRAME NAME/../FRAME NAME/)
       {
          intructions...
       }
    }
    comment devrait-on s'y prendre au mieux?
    Fichiers attachés Fichiers attachés

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Par défaut
    ben pour la première question c'est résolu.
    j'ai rajouté une virgule à la fin dans le match "|\," .

    avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($line =~/FRAME NAME:.*[\(|\[]([A-Z]+_[A-Z]+(?:[_ A-Z 0-9]+)?)[\)|\]]/)
    après:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($line =~/FRAME NAME:.*[\(|\[]([A-Z]+_[A-Z]+(?:[_ A-Z 0-9]+)?)[\)|\]|\,]/)
    reste la deuxième question!


  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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
    Par défaut
    Citation Envoyé par lauvydream Voir le message
    Bonjour 6ril23 et merci pour ta Regexp,

    j'ai actualisé le fichier texte en pièce jointe. Dans le dernier bloc il y a la fonction DT_PT_1 qui revient
    et j'aimerais la choper aussi. Donc dans le résultat on devrait la voir 2 fois. comment étendre la Regexp?
    Non c'est normal de ne pas la voir la seconde fois car je recherche les motifs (Fonction) et [Fonction], or dans ce cas le motif est (Fonction, ...)
    La seule modification que je pense être possible de ne pas mettre le "[\)|\]]" à la fin de la regex MAIS attention, plus tu seras laxiste dans ta regex, plus tu ramèneras des résultats souhaités mais aussi non souhaités

    Citation Envoyé par lauvydream Voir le message
    la deuxième question c'est, si je travaille par bloc avec délimiteurs, alors je ne peux plus extraire les fonctions (vu qu'elle
    sont contenues dans les lignes portant les délimiteurs.)
    effectivement si tu travailles par bloc tu perds le "tag" 'FRAME NAME' et tu risques de galérer car le modèle AAA_BBB_X n'est pas spécifique de ta fonction


    Citation Envoyé par lauvydream Voir le message
    comment devrait-on s'y prendre au mieux?
    Y a-t-il un impératif à ce que tu travailles par bloc?
    Personnellement je trouve beaucoup mieux de faire lire ton fichiers ligne par ligne et de les traiter en même temps quand c'est possible

    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
     
    open($fhR, $fichier_name);
    while (<$fhR>)
    {
            if ($_ =~/FRAME NAME:.*[\(|\[]([A-Z]+_[A-Z]+(?:[_ A-Z 0-9]+)?)[\)|\]]/)
            {
                    print"my Frame: $1\n";
            }
            elsif ($_ =~/regex2/)
            {
                    print "mon info: $1 $2 $3...\n";
            }
            elsif ($_ =~/regex3/)
            {
            }...
            else
            {
                    # Traitement de tes autres lignes
            }
    }
    Quand je parle de traitement ça peut être une écriture direct dans ton fichier de sortie, mais ça peut également utiliser des Tableaux de hash pour stocker tes infos: attention dans ce cas aux clés en doublons dans le fichier afin de ne pas écraser tes données


    [Edit] Oui avec la virgule ça doit fonctionner très bien aussi, j'y avais pas pensé

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Par défaut
    Citation Envoyé par 6ril23 Voir le message
    Y a-t-il un impératif à ce que tu travailles par bloc?
    Personnellement je trouve beaucoup mieux de faire lire ton fichiers ligne par ligne et de les traiter en même temps quand c'est possible
    Impératif... oui (et non)!
    c'est l'idée lumineuse que j'ai eue.
    en fait j'ai déjà extrait toutes les infos qui m'intéressent. (dans les lignes précédées de :::: )
    le problème est ailleurs.
    Le document vient d'un client et les infos extraites me servent pour les test sur réseaux CAN et FlexRay. Dans le document il y a des frames
    destinées parfois à un seul CAN (j'en ai 2, A et FA), parfois aux deux. Toutefois les équipes Soft du client pour une raison ou une autre ont
    omis la définition des signaux contenus dans ces trames pour un des CAN (exemple DT_PT_1 dans le fichier *.txt joint)

    Si tu regardes le fichier avec l'exemple de DT_PT_1 tu verras qu'il apparait au bloc 1 pour le FA-CAN avec une définition des signaux
    (lignes précédées par :::: ) et en fin de doc une 2nd fois pour le A-CAN sans signaux (No messages configured).

    Ce 2e script est en fait un patch et le but de travailler par bloc me permet (je le pense) de colmater les infos récupérées:

    1- je récupère le nom de la fonction (la trame exp: DT_PT_1)
    2- si "No messages configured" je parcoure le fichier pour voir si DT_PT_1 réapparait
    3- (c'est le cas ici) je recopie les infos extraites pour colmater le manque au point 2.

    Voilà!!

    Je ne sais pas si j'ai réussi à me faire comprendre!

  9. #9
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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
    Par défaut
    donc si j'ai bien compris tu lis 2 fois ce fichier?

    Pourquoi ne pas utiliser mon exemple en créant un tableau de hash qui aurait cette forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DT_PT_1 => 
                     A-CAN => 'Nosignal'   # qui quand trouvera le 2ème bloc remplacera par la vrai valeur
                     FA-CAN => 'mavaleur'
                     renseignement1 =>...
                     ...
    FRAME NAME2 =>
                     ...
    tu pourras ensuite parcourir ton hash afin de traiter chaque "FRAME NAME" avec toutes ces informations

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Par défaut
    Re-bonjour Cyril,
    bon il m'a semblé un peu plus compliqué de passer par un hash.

    voici ce que j'ai rapidement fait, mais qui malheureusement ne me produit pas le résultat escompté.
    Lancer le script depuis la console => script_name <test_file> <frame à rajouter>,<frame à rajouter> [<Output folder>]

    ici "frame à rajouter" = DT_PT_1 et DIAG_OBD_ENG

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    use constant SCRIPT_NAME => "patch_mapping.pl";
    use constant SCRIPT_VERSION => "1.0.1";
     
    #use Log4TA;
     
     
    #Log_Info("USAGE: " . SCRIPT_NAME . <Frame Report Folder> <FRAME_NAME>,<FRAME_NAME>  [<output directory>]");
     
    #Log_SetOutDir(".");
    #Log_SetOutFile("log_patch_mapping.log");
     
    my $ScrDIR = $ARGV[0]; 
    my $FrameName = $ARGV[1];
    my $out_dir = $ARGV[2];
     
    my $frame;
    my $emptyFrame;
    my @added_frames;
     
    #-----Open source file------------------	
    my $FrameReport = $ScrDIR."\\test.txt"; #Source document: Frame report list
    my $fhR; 
    open ($fhR, $FrameReport) or die "Unable to open the file $FrameReport\n"; 
    #----------------------------------------
     
    #-----add signal to mapping file--------
    my $fhWrite = $out_dir."\\Liste_1".".txt";# Created document: mapping INCA Signal name - Internal signal name
    open ($out_dir, '>>', $fhWrite) or die "Unable to open the file $fhWrite\n";
    #----------------------------------------
     
    # check for valid input parameter
    if(! defined $FrameReport or ! -f $FrameReport)
    {
        Log_Error("No frame report file given!");
        die;
    }
     
    if(!defined $FrameName)
    {
        Log_Error("No frame name given!");
        die;
    }
    else
    {
        #$FrameName =~ s/^frame=//i;
        #@added_frames = split("[\,\;]",$FrameName);
          @added_frames = split(/,/,$FrameName);
    }
     
    if(defined $out_dir)
    {
        if(! -d $out_dir)
        {
            mkdir $out_dir;
        }
    }
    else
    {
        $out_dir = ".";
    }
     
    my $read_state = 0;
     
    local $/ = q||;
    #print"my added frame: $added_frames[0]--$added_frames[1]\n";
     
    while ($line = <$fhR>) #As long as the file fhR contains data, we read the data
    {
    	foreach $frame(@added_frames)
           {
               if($line =~ /^FRAME NAME:\s+.*?$frame/)		
    	  {			
    		$read_state = 0;
    		#Log_Debug("Frame: $frame");
    		print"my frame: $frame\n";
     
     
    	}
     
    	if($read_state == 0 and $line =~ /$frame/)
    	{
    		$read_state = 1;
    		#$emptyFrame = $frame;
    		#print"not found\n";
    		#print"my frame 1: $emptyFrame\n";
    	}
     
    	if($read_state == 1 and $line =~ /No messages configured/)
    	{
    		$read_state = 2;
    		$emptyFrame = $frame;
    		print"not found\n";
    		print"my frame 1: $emptyFrame\n";
    		print"my empty frame: $emptyFrame\n";
    	}
     
           if ($read_state == 2 $line =~ /::::0x/)
          {
    		print"my empty frame: $emptyFrame\n";
     		if($line =~ /FREI/ or $line =~ /ID2\)/) #ignore lines with "FREI" or "(ID2)"
    		 {}
     
    	         else
    		{   
    			( $_, $line) = split(/\(/,$line);   	      #selects string after the opened bracket
    			( $_, $line) = split(/\)/,$line);               #from the selected string, selects the one before the closed bracket
     
    			@array = split(/, /,$line);
    			print $out_dir  $_, ";", "$array[1]\n";
    			#$countPar = $countPar +1;		      #count the number of mapping <internal variables> to <INCA variables>
    		}
    	}
     
    }

    Je ne sais pas trop mais bon... j'ai voulu untiliser la variable $read_state pour arriver à mes fins. Au final on devrait avoir la
    liste en pièce jointe (pour l'exemple du fichier test.txt)
    Fichiers attachés Fichiers attachés

  11. #11
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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
    Par défaut
    @lauvydream, je suis désolé mais ton code est bourré d'erreurs à l'exécution chez moi, j'en ai corrigé quelques unes mais là j'ai pas trop le temps de me pencher sur un code pas du tout fonctionnel
    j'essayerai de m'y remettre bientôt

    IMPORTANT:Mets en début de ton(tes) code(s)
    ça t'aidera à debugger les variables non déclarées, la '}' manquante...

    Citation Envoyé par lauvydream
    Re-bonjour Cyril,
    bon il m'a semblé un peu plus compliqué de passer par un hash.
    Pourrais-tu m'expliquer ce qui est plus compliqué?
    Cette méthode consiste à remplir un hash en lisant le fichier comme tu le fais actuellement
    il te suffira ensuite de parcourir la liste des éléments à récupérer (ARGV[1]) et d'extraire toutes les données dans le hash qui leur sont attachées.

    Le gros avantage sera le fait que tu n'essayera pas de faire une opération sur une donnée manquante (que tu aura plus tard dans le fichier)
    l'autre avantage sera de ne pas avoir 2 flux ouverts en même temps

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Par défaut
    Je suis finalement arrivé...presque à terme!
    Alors j'ai écris le code ci-dessous qui retrouve 99% de mes signaux.
    Mon problème c'est qu'il y a environ 1% de trames qui sont trouvées mais dont les signaux ne sont pas extraits.
    Pourtant la structure est la même.
    Quelqu'un y voit l'erreur?

    NB: pour ces 1% il semblerait que le script lignes 147-151 ne trouve rien!

    USAGE: . SCRIPT_NAME . <test.txt Folder> <FRAME_NAME>,<FRAME_NAME> [<output directory>]

    pour exemple, la trame TORQ_CRSH_3 ( = FRAME NAME dans usage en haut) n'est pas extraite!!

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
     
    use strict;
    use warnings;
     
    use List::Util qw(first);
     
     
    use constant SCRIPT_NAME => "patch_mapping.pl";
    use constant SCRIPT_VERSION => "1.0.0";
     
    #use Log4TA;
     
     
    #Log_Info("USAGE: " . SCRIPT_NAME . <Frame Report Folder> <FRAME_NAME>,<FRAME_NAME>  [<output directory>]");
     
    #Log_SetOutDir(".");
    #Log_SetOutFile("log_patch_mapping.log");
     
    my $ScrDIR = $ARGV[0]; 
    my $FrameName = $ARGV[1];
    my $out_dir = $ARGV[2];
    my $FrameReport;
    my $AddedFrame;
    my @added_frames;
    my $frm_report;
    my @array;
    my $input;
    my $frame_name;
    my $ReadState = 0;
    my @signals;
    my @found;
     
    #Log_Info("Running script " . SCRIPT_NAME . " version " . SCRIPT_VERSION);
    #Log_Info("USAGE: " . SCRIPT_NAME . " <Frame Report Folder> <FRAME_NAME>,<FRAME_NAME>  [<output directory>]\n\n");
     
     
    #----------------------Main--------------------------------------
    while ($input ne "quit")
    {
    #CAN OR FLEXRAY OR QUIT
    	print "\n-\t1 for Acan or FAcan \n-\t2 for Flex\n-\tquit to terminate\n=> ";
    	$input = <STDIN>;
    	chomp $input;
     
    	if ($input eq "1")
    	{
    		$FrameReport = $ScrDIR."\\test.txt"; #Source document: Frame report list
    		$ReadState = 1;
    		# change block separator to have one complete frame
    		# read per iteration
    		local $/ = "\nFRAME NAME:";
    		&Add_Frames();
    	}
    	elsif ($input eq "2")
    	{
    		$FrameReport = $ScrDIR."\\frm_flex_report.txt"; #Source document: Frame report list
    		$ReadState = 2;
    		# change block separator to have one complete frame
    		# read per iteration
    		local $/ = "FRAME NAME:";
    		&Add_Frames();
    	}
     
    	elsif ($input eq "quit")
    	{				
    		$ReadState = 0;
    		exit;
    	}
    	else
    	{
    	print "\nThe value entered is false, please enter a correct value.\n\n";
    	}	
    }
    #--------------------END Main--------------------------------------
     
     
    sub Add_Frames
    {
    	# check for valid input parameter
    	if(! defined $FrameReport or ! -f $FrameReport)
    	{
    		Log_Error("No frame report file given!");
    		die;
    	}
     
    	if(!defined $FrameName)
    	{
    		Log_Error("No frame name given!");
    		die;
    	}
    	else
    	{
    		@added_frames = split(/,/,$FrameName);
    	}
     
    	if(defined $out_dir)
    	{
    		if(! -d $out_dir)
    		{
    			mkdir $out_dir;
    		}
    	}
    	else
    	{
    		$out_dir = ".";
    	}
     
    	#$size = scalar(@added_frames);
    	#for my $i(0..$size - 1)
    	#{
    	#	Log_Info("added frame:  $added_frames[$i]");
    	#}
     
     
    	#-----Open source file------------------	
     
    	{ 
    		open my $fhR, '<', $FrameReport or die "$FrameReport: $!"; 
    		#----------------------------------------
     
    		#-----add signal to mapping file--------
    		my $fhWrite = $out_dir."\\mapping".".txt";
    		open ($out_dir, '>>', $fhWrite) or die "Unable to open the file $fhWrite\n";
    		#----------------------------------------
     
    		# change block separator to have one complete frame
    		# read per iteration
    		#local $/ = "\nFRAME NAME:";
     
    		# read the blocks
    		while ( my $block = <$fhR> ) 
    		{
    			next if $. == 1;    # skip the "header"
     
    			chomp $block;       # remove block separator
     
    			# get frame name
    			($frame_name)  = $block =~ m{\A [^\(\[]*[\(\[] (\w+) [\)\]\,] }x;
     
    			# skip the frame when no name is given
    			next if !$frame_name;
     
    			# check if user wants to get info about frame. Skip the frame if the
    			# user didn't mentioned it
    			next if !first{ $frame_name eq $_ }@added_frames;
     
    			# get all signals
    			if ($ReadState == 1)
    			{
    				@signals = grep{ $_ }$block =~ m{^ \s* :+ 0x\d+ (.*?) \r?\n? $}xmg;
    			}
     
    			if ($ReadState == 2)
    			{
    				@signals = grep{ $_ }$block =~ m{^ \s* :+ \d+ (.*?) \r?\n? $}xmg;
    			}
    			#print"my signal 1: $signals[0]\n";
    			@found;
     
    			for my $signal( @signals ) 
    			{
    				# skip signals that contains "FREI" or "(ID2)"
    				next if index( $signal, 'FREI' )  != -1;
    				next if index( $signal, '(ID2)' ) != -1;
     
    				if ($ReadState == 1)
    				{					
    					# skip signal if it does not contain _FA, or _A,
    					next if $signal !~ m{ _F?A, }x;
    					next if $signal !~ m{ \( }x;
    				}
    				if ($ReadState == 2)
    				{					
    					# skip signal if it does not contain _FX,
    					next if $signal !~ m{ _FX, }x;
    				}
     
    					#selects string after the opened bracket
    					( $_, $signal) = split(/\(/,$signal);
     
    					#from the selected string, selects the one before the closed bracket
    					( $_, $signal) = split(/\)/,$signal); 		 
     
    					@array = split(/, /,$signal);
    					print $out_dir  $_, ";", "$array[1]\n";
    					Log_Info("added signal:  $_; $array[1]");
    					#my ($value) = $signal =~ m{ \( ([^\)]+) \)\,([^']+)\,}x;
     
    			}		
     
    		}
     
    		close $fhR;
    		exit;
    	}
    }
    Fichiers attachés Fichiers attachés

  13. #13
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Par défaut
    Personne pour me répondre?

  14. #14
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Par défaut
    Problème résolu!

    dans l'expression

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @signals = grep{ $_ }$block =~ m{^ \s+ :+ 0x\d+ (.*?) \r?\n? $}xmg;
    j'ai rajouté un =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @signals = grep{ $_ }$block =~ m{^ \s+ :+ 0x\w+|\d+ (.*?) \r?\n? $}xmg;
    En effet, dans le fichier aux lignes concernées, il apparait parfois une lettre avant les chiffres.

    ::::0x3fb, DriveTrainData1_FA, Soll_Drehzahl_Leerlauf_Antrieb_Erweitert
    ::::0xa7, TrqCrsh3_A, Alive_Drehmoment_Kurbelwelle_3

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/07/2012, 17h37
  2. Expression réguliére
    Par Mad_Max dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 16/09/2003, 18h17
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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