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 :

pbm avec une regex


Sujet :

Langage Perl

Vue hybride

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 296
    Par défaut pbm avec une regex
    Bonjour,
    j'ai un pbm,si je comprend bien mon code puisque je suis débutant, avec une regex normalement pour moi ça dois marcher voila mon code si vous voyez la faute
    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
    $Phrase = "AFCT = 068-083-01 ETAT = NENG+BLOJ"; 
    if($Phrase =~ /
    			  \s*AFCT\s*=\s*(\d{3}\-\d{3}\-\d{2})
    			  \s*ETAT\s*=\s*(\w{4}\+\w{4})
    			  $/)      
    {  
    			my $AFCT = $1;
    			my $ETAT = $2;
    print 'afct: '.$AFCT."\n"; 
    print 'etat: '.$ETAT."\n"; 
     
      } 
    $Phrase2 = "NATC = CSM7   TYC = JML10E07   NFSC = TOL2M"; 
    if($Phrase2 =~ /
    			   \s*NATC\s*=(\w{3}\d{1})
    			   \s*TYC\s*=\s*(\w{3}\d{2}\w{2}\d{1})
    			   \s*NFSC\s*=\s*(\w{3}\d{1}\w{1})
    			   $/) 
    {  
    			my $NATC= $1;
    			my $TYC = $2;
    			my $NFSC = $3;
    print 'NATC: '.$NATC."\n"; 
    print 'TYC :'.$TYC."\n"; 
    print 'NFSC: '.$NFSC."\n";
     }   
    $Phrase3 = "PS =03160   CIC=00449   TYR=RN"; 
    if($Phrase3 =~ /
    			   \s*PS\s*=(\w{5})
    			   \s*CIC\s*=\s*(\w{6})
    			   \s*TYR\s*=\s*(\w{2})
    			   $/) 
    {
    			my $PS= $1;
    			my $CIC = $2;
    			my $TYR = $3;
    print 'PS: '.$PS."\n"; 
    print 'CIC :'.$CIC."\n"; 
    print 'TYR: '.$TYR."\n";
      }
    merci beaucoup de votre aide.

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Tu as oublié le /x à la fin de tes regex : si tu ne le mets pas, les espaces dans ta regex doivent être matchés littéralement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    m/
    			   \s*NATC\s*=(\w{3}\d{1})
    			   \s*TYC\s*=\s*(\w{3}\d{2}\w{2}\d{1})
    			   \s*NFSC\s*=\s*(\w{3}\d{1}\w{1})
    			   $/x
    --
    Jedaï

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 296
    Par défaut
    ça marche merci Jedaï

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 296
    Par défaut
    et me revoila avec un autre pbm:
    voila 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
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use DBI;
     
    my $basedir = 'C:/Program Files/EasyPHP1-8/www/traitement';
    open my ($src), '<', "$basedir/AUDIT_CIC_HS16.txt"
      or die "E/S : $!\n";
     
    # Connect to the database.
    my $dbh = DBI->connect( "DBI:mysql:database=tdm;host=localhost",
        "chakri", "farid", { 'RaiseError' => 1 } );
     
    my $sth =
      $dbh->prepare(
            "INSERT INTO srfil ( ct, afct, etat, nmfsc, cic, natc, tyc, ps, tyr)"
          . " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)" );
     
    # variable d'état pour savoir si l'on se trouve dans ule paragraphe qu'on veut imprimer ($in == 2), après une commande ($in == 1),
    # ou en dehors de tout cela ($in == 0)
    my $in = 0;
    my ( $ct, $afct, $etat, $nmfsc, $cic, $natc, $tyc, $ps, $tyr);
    while (<$src>) {
        if ( not $in and my ($cmd) = (m/====\s*CT=(\w{2}\d{2})\s*====/) ) {
            $ct = $1;
    		$in = 1;
        }
        elsif (
            $in == 1
            and m{^\s*
    			AFCT\s*=\s*(\d{3}\-\d{3}\-\d{2})
    			\s*ETAT\s*=\s*(\w{4}\+\w{4})
    			$/}x
          )
        {
            if ( defined $afct ) {
                $sth->execute( $ct, $afct, $etat, $nmfsc, $cic, $natc, $tyc, $ps, $tyr)
                  or die "pb de requete : $DBI::errstr";
            }
            $afct = $1;
            $etat = $2;
        }
        elsif (
            $in == 1
            and m{^\s*
    			NATC\s*=\s*(\w{3}\d{1})
    			\s*TYC\s*=\s*(\w{3}\d{2}\w{2}\d{1})
    			\s*NFSC\s*=\s*(\w{3}\d{1}\w{1})
    			$/}x
          )
        {
            $natc = $1;
            $tyc = $2;
            $nmfsc = $3;
        }
        elsif ( $in == 1 and  m{^\s*
    			PS\s*=(\d{5})
    			\s*CIC=(\d{5})
    			\s*TYR=(\w{2})
    			$/}x) {
            $ps = $1;
            $cic = $2;
            $tyr = $3;
     
    		if ( defined $afct ) {
                $sth->execute( $ct, $afct, $etat, $nmfsc, $cic, $natc, $tyc, $ps, $tyr)
                  or die "pb de requete : $DBI::errstr";
            }
            ( $ct, $afct, $etat, $nmfsc, $cic, $natc, $tyc, $ps, $tyr) = (undef) x 9;
            $in = 1;
     
    	    #elsif ( $in == 1 and eof ) {    $in = 0;		}
        }
    }
     
    close $src;
     
    $dbh->disconnect;
    mes regex marche bien toute seule mais lorsque je les intègre dans mon scripts j'ai e bug svt en image
    j'ai un autre truc à dire c'est qu'il y a tout le temps une ligne vide entre deux
    voila un extrait du fichier source
    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
    ==== CT=BX01 ====
       AFCT = 068-083-01 ETAT = NENG+BLOJ
     
                         NATC = CSM7   TYC = JML10E07   NFSC = TOL2M
     
                         PS =03160   CIC=00449   TYR=RN
     
       AFCT = 068-083-02 ETAT = NENG+BLOJ
     
                         NATC = CSM7   TYC = JML10E07   NFSC = TOL2M
     
                         PS =03160   CIC=00450   TYR=RN
     
       AFCT = 068-083-03 ETAT = NENG+BLOJ
     
                         NATC = CSM7   TYC = JML10E07   NFSC = TOL2M
     
                         PS =03160   CIC=00451   TYR=RN
     
       AFCT = 068-083-04 ETAT = NENG+BLOJ
     
                         NATC = CSM7   TYC = JML10E07   NFSC = TOL2M
     
                         PS =03160   CIC=00452   TYR=RN
     
       AFCT = 068-083-05 ETAT = NENG+BLOJ
     
                         NATC = CSM7   TYC = JML10E07   NFSC = TOL2M
     
                         PS =03160   CIC=00453   TYR=RN
    merci beaucoup de votre aide

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    afct n'est pas un champ de la table srfil.

    --
    Jedaï

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 296
    Par défaut
    autant pour moi j'ai pas changé le nom de la table je m'excuse.
    j'arrive à envoyer les donner à la bdd c'est un exploit mais toutefois j'ai un problem qui persiste il me prend justement les 3 premieres variables et les autres NULL le revoila mon code avec des petite retouches.
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use DBI;
     
    my $basedir = 'C:/Program Files/EasyPHP1-8/www/traitement';
    open my ($src), '<', "$basedir/AUDIT_CIC_HS16.txt"
      or die "E/S : $!\n";
     
    # Connect to the database.
    my $dbh = DBI->connect( "DBI:mysql:database=tdm;host=localhost",
        "chakri", "farid", { 'RaiseError' => 1 } );
     
    my $sth =
      $dbh->prepare(
            "INSERT INTO mic_hs ( ct, afct, etat, nmfsc, cic, natc, tyc, ps, tyr)"
          . " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)" );
     
    # variable d'état pour savoir si l'on se trouve dans ule paragraphe qu'on veut imprimer ($in == 2), après une commande ($in == 1),
    # ou en dehors de tout cela ($in == 0)
    my $in = 0;
    my ( $ct, $afct, $etat, $nmfsc, $cic, $natc, $tyc, $ps, $tyr);
    while (<$src>) {
        if ( not $in and my ($cmd) = (m/====\s*CT=(\w{2}\d{2})\s*====/) ) {
            $ct = $1;
    		$in = 1;
        }
        elsif (
            $in == 1
            and m{^\s*
    			AFCT\s*=\s*(\d{3}\-\d{3}\-\d{2})
    			\s*ETAT\s*=\s*(\w{4}\+\w{4})
    			$/}x
          )
        {
            if ( defined $afct ) {
                $sth->execute( $ct, $afct, $etat, $nmfsc, $cic, $natc, $tyc, $ps, $tyr)
                  or die "pb de requete : $DBI::errstr";
            }
            $afct = $1;
            $etat = $2;
        }
        elsif (
     
            $in == 1
            and m{^\s*
    			NATC\s*=\s*(\w{3}\d{1})
    			\s*TYC\s*=\s*(\w{3}\d{2}\w{1}\d{2})
    			\s*NFSC\s*=\s*(.*)
    			$/}x
          )
        {
            $natc = $1;
            $tyc = $2;
            $nmfsc = $3;
        }
        elsif ( $in == 1 and  m{^\s*
    			PS\s*=(\d{5})
    			\s*CIC=(\d{5})
    			\s*TYR=(\w{2})
    			$/}x) {
            $ps = $1;
            $cic = $2;
            $tyr = $3;
     
    		if ( defined $afct ) {
                $sth->execute( $ct, $afct, $etat, $nmfsc, $cic, $natc, $tyc, $ps, $tyr)
                  or die "pb de requete : $DBI::errstr";
            }
            ( $ct, $afct, $etat, $nmfsc, $cic, $natc, $tyc, $ps, $tyr) = (undef) x 9;
            $in = 1;
     
    	    #elsif ( $in == 1 and eof ) {    $in = 0;		}
        }
    }
     
    close $src;
     
    $dbh->disconnect;
    un petit extrait de src
    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
       AFCT = 167-009-16 ETAT = NENG+BLOF
     
                         NATC = CSM7   TYC = JML10E07   NFSC = IU55M
     
                         PS =02168   CIC=01285   TYR=RN
     
       AFCT = 167-009-17 ETAT = NENG+BLOF
     
                         NATC = CSM7   TYC = JML10E07   NFSC = IU55M
     
                         PS =02168   CIC=01286   TYR=RN
     
       AFCT = 167-009-18 ETAT = NENG+BLOF
     
                         NATC = CSM7   TYC = JML10E07   NFSC = IU55M
     
                         PS =02168   CIC=01287   TYR=RN
     
       AFCT = 167-009-19 ETAT = NENG+BLOF
     
                         NATC = CSM7   TYC = JML10E07   NFSC = IU55M
     
                         PS =02168   CIC=01288   TYR=RN
     
       AFCT = 167-009-20 ETAT = NENG+BLOF
     
                         NATC = CSM7   TYC = JML10E07   NFSC = IU55M
     
                         PS =02168   CIC=01289   TYR=RN
     
       AFCT = 167-009-21 ETAT = NENG+BLOF
     
                         NATC = CSM7   TYC = JML10E07   NFSC = IU55M
     
                         PS =02168   CIC=01290   TYR=RN
     
       AFCT = 167-009-22 ETAT = NENG+BLOF
     
                         NATC = CSM7   TYC = JML10E07   NFSC = IU55M
     
                         PS =02168   CIC=01291   TYR=RN
     
       AFCT = 167-009-23 ETAT = NENG+BLOF
     
                         NATC = CSM7   TYC = JML10E07   NFSC = IU55M
     
                         PS =02168   CIC=01292   TYR=RN
     
       AFCT = 167-009-24 ETAT = NENG+BLOF
     
                         NATC = CSM7   TYC = JML10E07   NFSC = IU55M
     
                         PS =02168   CIC=01293   TYR=RN
     
       AFCT = 167-009-25 ETAT = NENG+BLOF
     
                         NATC = CSM7   TYC = JML10E07   NFSC = IU55M
     
                         PS =02168   CIC=01294   TYR=RN
    et il me donne aucune faute. j'ai beau explosé mes yeux pour détecter qqc sans exploi. (j'ai changer qd meme le regex pour la variable 'NFSC')

    merci bcp de votre aide.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/02/2007, 15h07
  2. [RegEx] problème avec une regex
    Par lanfeust42 dans le forum Langage
    Réponses: 2
    Dernier message: 19/09/2006, 08h48
  3. [RegEx] Remplacement des accents avec une regex
    Par benohit dans le forum Langage
    Réponses: 7
    Dernier message: 07/09/2006, 18h20
  4. [RegEx] Problème avec une ReGex
    Par Death83 dans le forum Langage
    Réponses: 9
    Dernier message: 27/07/2006, 21h27
  5. Problème avec une RegEx
    Par Death83 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 26/05/2006, 14h03

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