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 :

[regexp] petit problème d'expression régulière


Sujet :

Langage Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut [regexp] petit problème d'expression régulière
    Bonjour à tous !!!

    Voilà, j'ai un fichier dans lequel je dois séparer des blocs de lignes en fonction de plusieurs critères.
    Il y a deux type de bloque concaténer dans deux fichiers respectifs.

    Les règles sont les suivantes:

    Pour déterminer les blocs qui iront dans le fichier 1:
    - Le bloc commence toujours par UNB+UNOA
    - Le bloc se termine toujours par UNZ+

    Pour déterminer les blocs qui iront dans le fichier 2:
    - Le bloc commence toujours par STX=ANA
    - Le bloc se termine par END= suivi d'un chiffre (0 à 9)

    J'ai fait le script suivant pour résliser cela mais ça n'as pas l'aire de fonctionner toujours. ça à l'air de venir de la détermination du bloc 2.

    Pouvez vous jeter un petit coups d'oeil expert et me dire ce qui ne va pas ???

    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
     
    #!c:\perl\bin\perl.exe
     
    $fic_in='c:\wsta\m-sga400.r';
    $fic_out_edifact='c:\wsta\m-atlas.r';
    $fic_out_tradacom='c:\wsta\m-sga400.r2';
     
    $Tradacom_entete='STX=ANA';
    $Edifact_entete='UNB\+UNOA';
    $Tradacom_end='END=[0-9]\'';
    $Edifact_end='UNZ\+';
     
    $nb_tradacom=0;
    $nb_edifact=0;
     
    open(fic,$fic_in) or die "Impossible d'ouvrir $fic_in\n$!\n";
    @file=<fic>;
    close(fic);
     
    &SearchTradacom();
    &WriteTradacom();
     
    &SearchEdifact();
    &WriteEdifact();
     
    print "* $nb_tradacom commandes tradacom trouvees\n* $nb_edifact commandes edifact trouvees\n* Job Done \1\1\n";
     
    sub WriteTradacom()
    {
          print "---Tradacom---\n";
          open(fic,">$fic_out_tradacom") or die "Impossible d'ouvrir $fic_out_tradacom\n$!\n";
     
          for(my $i=0;$i<=$#Tradacom;$i++)
          {
                print "$i. $Tradacom[$i]{'debut_tradacom'} ---  $Tradacom[$i]{'fin_tradacom'}\n";
                for(my $j=$Tradacom[$i]{'debut_tradacom'};$j<=$Tradacom[$i]{'fin_tradacom'};$j++)
                {
                      print fic "$file[$j]";
                }
          }
          close(fic);
    }
     
     
    sub WriteEdifact()
    {
          print "---Edifact---\n";
          open(fic,">>$fic_out_edifact") or die "Impossible d'ouvrir $fic_out_edifact\n$!\n";
          for(my $i=0;$i<=$#Edifact;$i++)
          {
                print "$i. $Edifact[$i]{'debut_edifact'} ---  $Edifact[$i]{'fin_edifact'}\n";
                for(my $j=$Edifact[$i]{'debut_edifact'};$j<=$Edifact[$i]{'fin_edifact'};$j++)
                {
                      print fic "$file[$j]";
                }
          }
          close(fic);
    }
     
     
    sub SearchTradacom()
    {
          for (my $i=0;$i<=$#file;$i++)
          {
                if($file[$i]=~/$Tradacom_entete/)
                {
                      $debut=$i;
                      for(my $j=$i;!($file[$j]=~/$Tradacom_end/)&&$j<$#file;$j++)
                      {
                            $fin=$j;
                      }
                      $Tradacom[$nb_tradacom]{'debut_tradacom'}=$debut;
                      $Tradacom[$nb_tradacom]{'fin_tradacom'}=$fin+1;
                      $nb_tradacom++;
                }
          }
    }
     
     
    sub SearchEdifact()
    {
          for (my $i=0;$i<=$#file;$i++)
          {
                if($file[$i]=~/$Edifact_entete/)
                {
                      $debut=$i;
                      for(my $j=$i;!($file[$j]=~/$Edifact_end/)&&$j<$#file;$j++)
                      {
                            $fin=$j;
                      }
                      $Edifact[$nb_edifact]{'debut_edifact'}=$debut;
                      $Edifact[$nb_edifact]{'fin_edifact'}=$fin+1;
                      $nb_edifact++;
                }
          }
    print "\nfin\n";
    }
    Merci beaucoup pour vos réponses, c'est pour mon boulot et je dois le corriger avant de partie en vacances (demain ;o((((( )

    Bonne journée,
    Guillaume.
    tout le monde est d'accord pour critiquer la pensée unique

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    peux tu rexpliquer avec un exemple!!
    Si je comprends bien, tu dois parser UN fichier qui a une certaine forme afin de recuperer des blocs?
    Peux tu montrais une portion de ce fichier avec un exemple de resultat attendu, je te donnerai un coup de main.

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    bon j'ai terminer ton script, je recupere tes blocs en 2 lignes (vives les regex) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    open (FILE, $fic_in);
    my @file = <FILE>;
    close(FILE);
    my $les_lignes = join("",@file);
    my @bloc1 = $les_lignes =~ /^(UNB\+UNOA.+?UNZ\+.+?$)/msgi;
    my @bloc2 = $les_lignes =~ /^(STX=ANA.+?END=\d.+?$)/msgi;
    dans @bloc1 et @bloc2 tu auras tes différents blocs dont tu souhaitais.
    t'en fais ce que tu veux apres. Dis moi si ça te convient ou si tu souhaites des explications

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Bonjour Djibril,

    Merci beaucoup pour ta réponse !!

    J'aimerai, en effet, si tu peux, avoir quelques explications sur ta solution.

    Tu m'a demandé un exemple de fichier à traiter et le résultat attendu.

    Alors ci-dessous, voilà le fichier complet (comprenant les fichiers edifact et les fichiers tradacom mélangés (il peut y avoir tradacom, tradacom, edifact, tradacom, edifact etc ...):
    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
     
    STX=ANA:1+xxxxxxxxxxx:xxxxxxxxxxxx+xxxxxxxxxx:xxxxxxxxx.+051214:174600+663586+        +ORDHDR+B'
    MHD=1+ORDHDR:6'
    TYP=0430+NEW ORDERS'
    SDT=3011576200005:25015+Eccccccd.+Acccccccccc:P.O. Boxccccccccccd::ST16'
    CDT=5016591000016:524+ccccccccccccccs+Dccccccccccccccement'
    FIL=428+1+051214'
    MTR=6'
    MHD=2+ORDERS:8'
    CLO=:524'
    ORD=436577::051214'
    DIN=051220++++0001'
    OLD=1+:111111++:111111+50+34++++GLASSPAPER FINE F2 PK5             .'
    OLD=2+:111111++:111111+40+19++++SANDER FLEXIBLE FINE/MEDIUM        .'
    OLD=3+:111111++:111111+10+30++++DETAIL PAPER COARSE 105MM          P'
    OLD=4+:111111++:111111+3+75++++BELT SAND SHTS 75X533MM CSE PK3    .'
    OLD=5+:111111++:111111+10+88++++ALUMINIUM OXIDE ROLL FINE 5M       .'
    OLD=6+:111111++:111111+10+96++++WET & DRY 4 SHEET ASSORTED         .'
    OLD=7+:111111++:111111+20+10++++FLEXBL SNDR ANGLD MED/CRS          .'
    OLD=8+:111111++:111111+40+19++++FLEXIBLE SANDER MEDIUM/COARSE      .'
    OLD=9+:111111++:111111+10+100++++DISC METAL CUTTING  PK3            .'
    OLD=10+:111111++:111111+10+15++++ECCENTRIC PAPER MEDIUM 125MM       P'
    OLD=11+:111111++:111111+10+75++++ECCENTRIC PAPER COARSE 125MM       P'
    OLD=12+:111111++:111111+50+28++++GLASSPAPER MEDIUM M2 PK5           .'
    OLD=13+:111111++:111111+5+28++++Professional 230mm Diamond Wheel   .'
    OLD=14+:111111++:111111+10+15++++DETAIL PAPER COARSE 95MM PK10      .'
    OLD=15+:111111++:111111+10+21++++DISC METAL GRINDING  PK3           .'
    OLD=16+:111111++:111111+10+80++++PREMIUM ALU OXIDE COARSE PK 4      .'
    OLD=17+:111111++:111111+10+100++++PREMIUM ALU OXIDE F/M/C ASST PK 10 .'
    OTR=17+1899'
    MTR=44'
    MHD=3+ORDERS:8'
    CLO=:524'
    ORD=436581::051214'
    DIN=060103++++0001'
    OLD=1+:111111++:111111+20+5++++FLEXBL SNDR ANGLD MED/CRS          .'
    OLD=2+:111111++:111111+10+14++++ORBITAL PAPER ASSORTED 228X115MM   P'
    OLD=3+:111111++:111111+10+14++++ORBITAL PAPER COARSE 228X115MM     P'
    OLD=4+:111111++:111111+10+15++++ECCENTRIC PAPER MEDIUM 125MM       P'
    OLD=5+:111111++:111111+10+15++++DETAIL PAPER ASSORTED 105MM        P'
    OLD=6+:111111++:111111+10+14++++ORBITAL PAPER MEDIUM 228X115MM     P'
    OLD=7+:111111++:111111+20+10++++FLXIBL SANDER ANGLED FINE/MEDIUM   .'
    OLD=8+:111111++:111111+18+20++++STEEL WOOL ASST F/M/C PK3          .'
    OLD=9+:111111++:111111+10+15++++DETAIL PAPER COARSE 105MM          P'
    OLD=10+:111111++:111111+10+15++++DETAIL PAPER MEDIUM 105MM          P'
    OLD=11+:111111++:111111+10+15++++DETAIL PAPER FINE 105MM            P'
    OLD=12+:111111++:111111+10+60++++ECCENTRIC PAPER ASSORTED 125MM     P'
    OTR=12+212'
    MTR=18'
    MHD=4+ORDTLR:4'
    OFT=2'
    MTR=3'
    END=4'
    UNB+UNOA:2+xxxxxxxxxxxxx:14+xxxxxxxxxxxxxxxxx:14+051215:0235+02015908630++ORDERS'
    UNH+1+ORDERS:D:93A:UN:EAN007'
    BGM+220::9+00247104'
    DTM+137:20051215:102'
    DTM+2:20051224:102'
    NAD+BY+xxxxxxxxxxxxxx::9'
    NAD+SU+xxxxxxxxxxxxxx::9'
    NAD+DP+xxxxxxxxxxxxxx::9'
    CUX+2:EUR:9+3:EUR:4'
    LIN+1++xxxxxxxxxxxxxx:EN::9'
    QTY+21:10'
    QTY+59:10'
    PRI+AAA:2.1::NTP'
    UNS+S'
    CNT+2:1'
    UNT+15+1'
    UNZ+1+02015908630'
    STX=ANA:1+xxxxxxxxx:xxxxxxxxxx:xxxxxxxxxx+051214:234834+50008400000392+        +ORDHDR+B'
    MHD=1+ORDHDR:6'
    TYP=0430'
    SDT=xxxxxxxxxx:xxxx+xxxxxxxxxx++577820309'
    CDT=xxxxxxxxxx+xxxxxxx'
    DNA=1++073:GBP'
    FIL=336+1+051214'
    MTR=7'
    MHD=2+ORDERS:8'
    CLO=:WGN800++:Trent Road::Grantham:NG31 7XQ'
    ORD=20204101::051214'
    DIN=051216'
    OLD=1+5010352229405:22900020++:25396218+15+980+6200+++10 SHT OAKEY GL/PAPER 230X280MM    ASST'
    DNB=1+1++::::::043:1'
    OTR=1+980'
    MTR=8'
    MHD=3+ORDTLR:4'
    OFT=1'
    MTR=3'
    END=3'
    UNB+UNOA:2+3025940000000:14+3011576201101:14+051215:0804+303863003'
    UNH+00000001+ORDERS:D:93A:UN:EAN007'
    BGM+220+50503031'
    DTM+137:20051214:102'
    DTM+2:20051230:102'
    FTX+GEN+++PER APPUNTAMENTO SCARICO CONTATTARE LO 02/906621271.LO SCARICO SI EFFE:TTUA DAL LUNED AL VENERD DALLE 07.30 ALLE 11.30 1 ORDINE, 1 BOLLA, 1 F:ATTURA.                               SEPARARE GLI ORDINI'
    FTX+GEN+++CLIENTI DALLO STOCK.'
    NAD+BY+xxxxxxxxxxxxx::9'
    NAD+DP+xxxxxxxxxxxxx::9'
    NAD+SU+xxxxxxxxxxxxx::9'
    CUX+2:EUR:9'
    LIN+1++xxxxxxxxxxxxx:EN'
    QTY+21:25.00'
    QTY+59:25.00'
    PRI+AAA:1.08'
    LIN+2++xxxxxxxxxxxxx:EN'
    QTY+21:100.00'
    QTY+59:100.00'
    PRI+AAA:1.00'
    LIN+3++xxxxxxxxxxxxx:EN'
    QTY+21:100.00'
    QTY+59:100.00'
    PRI+AAA:1.48'
    LIN+4++xxxxxxxxxxxxx:EN'
    QTY+21:100.00'
    QTY+59:100.00'
    PRI+AAA:0.78'
    LIN+5++xxxxxxxxxxxxx:EN'
    QTY+21:100.00'
    QTY+59:100.00'
    PRI+AAA:0.52'
    LIN+6++xxxxxxxxxxxxx:EN'
    QTY+21:25.00'
    QTY+59:25.00'
    PRI+AAA:0.89'
    LIN+7++xxxxxxxxxxxxx:EN'
    QTY+21:100.00'
    QTY+59:100.00'
    PRI+AAA:0.56'
    LIN+8++xxxxxxxxxxxxx:EN'
    QTY+21:100.00'
    QTY+59:100.00'
    PRI+AAA:0.61'
    LIN+9++xxxxxxxxxxxxx:EN'
    QTY+21:50.00'
    QTY+59:25.00'
    PRI+AAA:1.13'
    LIN+10++xxxxxxxxxxxxx:EN'
    UNS+S'
    MOA+79:1222.71'
    UNT+000093+00000001'
    UNZ+00001+303863003'
    Et voici le résultat que j'aimerai obtenir:
    Un fichier pour edifact:
    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
     
    UNB+UNOA:2+xxxxxxxxxxxxx:14+xxxxxxxxxxxxxxxxx:14+051215:0235+02015908630++ORDERS'
    UNH+1+ORDERS:D:93A:UN:EAN007'
    BGM+220::9+00247104'
    DTM+137:20051215:102'
    DTM+2:20051224:102'
    NAD+BY+xxxxxxxxxxxxxx::9'
    NAD+SU+xxxxxxxxxxxxxx::9'
    NAD+DP+xxxxxxxxxxxxxx::9'
    CUX+2:EUR:9+3:EUR:4'
    LIN+1++xxxxxxxxxxxxxx:EN::9'
    QTY+21:10'
    QTY+59:10'
    PRI+AAA:2.1::NTP'
    UNS+S'
    CNT+2:1'
    UNT+15+1'
    UNZ+1+02015908630'
    UNB+UNOA:2+3025940000000:14+3011576201101:14+051215:0804+303863003'
    UNH+00000001+ORDERS:D:93A:UN:EAN007'
    BGM+220+50503031'
    DTM+137:20051214:102'
    DTM+2:20051230:102'
    FTX+GEN+++PER APPUNTAMENTO SCARICO CONTATTARE LO 02/906621271.LO SCARICO SI EFFE:TTUA DAL LUNED AL VENERD DALLE 07.30 ALLE 11.30 1 ORDINE, 1 BOLLA, 1 F:ATTURA.                               SEPARARE GLI ORDINI'
    FTX+GEN+++CLIENTI DALLO STOCK.'
    NAD+BY+xxxxxxxxxxxxx::9'
    NAD+DP+xxxxxxxxxxxxx::9'
    NAD+SU+xxxxxxxxxxxxx::9'
    CUX+2:EUR:9'
    LIN+1++xxxxxxxxxxxxx:EN'
    QTY+21:25.00'
    QTY+59:25.00'
    PRI+AAA:1.08'
    LIN+2++xxxxxxxxxxxxx:EN'
    QTY+21:100.00'
    QTY+59:100.00'
    PRI+AAA:1.00'
    LIN+3++xxxxxxxxxxxxx:EN'
    QTY+21:100.00'
    QTY+59:100.00'
    PRI+AAA:1.48'
    LIN+4++xxxxxxxxxxxxx:EN'
    QTY+21:100.00'
    QTY+59:100.00'
    PRI+AAA:0.78'
    LIN+5++xxxxxxxxxxxxx:EN'
    QTY+21:100.00'
    QTY+59:100.00'
    PRI+AAA:0.52'
    LIN+6++xxxxxxxxxxxxx:EN'
    QTY+21:25.00'
    QTY+59:25.00'
    PRI+AAA:0.89'
    LIN+7++xxxxxxxxxxxxx:EN'
    QTY+21:100.00'
    QTY+59:100.00'
    PRI+AAA:0.56'
    LIN+8++xxxxxxxxxxxxx:EN'
    QTY+21:100.00'
    QTY+59:100.00'
    PRI+AAA:0.61'
    LIN+9++xxxxxxxxxxxxx:EN'
    QTY+21:50.00'
    QTY+59:25.00'
    PRI+AAA:1.13'
    LIN+10++xxxxxxxxxxxxx:EN'
    UNS+S'
    MOA+79:1222.71'
    UNT+000093+00000001'
    UNZ+00001+303863003'
    et un fichier tradacom:
    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
     
    STX=ANA:1+xxxxxxxxxxx:xxxxxxxxxxxx+xxxxxxxxxx:xxxxxxxxx.+051214:174600+663586+        +ORDHDR+B'
    MHD=1+ORDHDR:6'
    TYP=0430+NEW ORDERS'
    SDT=3011576200005:25015+Eccccccd.+Acccccccccc:P.O. Boxccccccccccd::ST16'
    CDT=5016591000016:524+ccccccccccccccs+Dccccccccccccccement'
    FIL=428+1+051214'
    MTR=6'
    MHD=2+ORDERS:8'
    CLO=:524'
    ORD=436577::051214'
    DIN=051220++++0001'
    OLD=1+:111111++:111111+50+34++++GLASSPAPER FINE F2 PK5             .'
    OLD=2+:111111++:111111+40+19++++SANDER FLEXIBLE FINE/MEDIUM        .'
    OLD=3+:111111++:111111+10+30++++DETAIL PAPER COARSE 105MM          P'
    OLD=4+:111111++:111111+3+75++++BELT SAND SHTS 75X533MM CSE PK3    .'
    OLD=5+:111111++:111111+10+88++++ALUMINIUM OXIDE ROLL FINE 5M       .'
    OLD=6+:111111++:111111+10+96++++WET & DRY 4 SHEET ASSORTED         .'
    OLD=7+:111111++:111111+20+10++++FLEXBL SNDR ANGLD MED/CRS          .'
    OLD=8+:111111++:111111+40+19++++FLEXIBLE SANDER MEDIUM/COARSE      .'
    OLD=9+:111111++:111111+10+100++++DISC METAL CUTTING  PK3            .'
    OLD=10+:111111++:111111+10+15++++ECCENTRIC PAPER MEDIUM 125MM       P'
    OLD=11+:111111++:111111+10+75++++ECCENTRIC PAPER COARSE 125MM       P'
    OLD=12+:111111++:111111+50+28++++GLASSPAPER MEDIUM M2 PK5           .'
    OLD=13+:111111++:111111+5+28++++Professional 230mm Diamond Wheel   .'
    OLD=14+:111111++:111111+10+15++++DETAIL PAPER COARSE 95MM PK10      .'
    OLD=15+:111111++:111111+10+21++++DISC METAL GRINDING  PK3           .'
    OLD=16+:111111++:111111+10+80++++PREMIUM ALU OXIDE COARSE PK 4      .'
    OLD=17+:111111++:111111+10+100++++PREMIUM ALU OXIDE F/M/C ASST PK 10 .'
    OTR=17+1899'
    MTR=44'
    MHD=3+ORDERS:8'
    CLO=:524'
    ORD=436581::051214'
    DIN=060103++++0001'
    OLD=1+:111111++:111111+20+5++++FLEXBL SNDR ANGLD MED/CRS          .'
    OLD=2+:111111++:111111+10+14++++ORBITAL PAPER ASSORTED 228X115MM   P'
    OLD=3+:111111++:111111+10+14++++ORBITAL PAPER COARSE 228X115MM     P'
    OLD=4+:111111++:111111+10+15++++ECCENTRIC PAPER MEDIUM 125MM       P'
    OLD=5+:111111++:111111+10+15++++DETAIL PAPER ASSORTED 105MM        P'
    OLD=6+:111111++:111111+10+14++++ORBITAL PAPER MEDIUM 228X115MM     P'
    OLD=7+:111111++:111111+20+10++++FLXIBL SANDER ANGLED FINE/MEDIUM   .'
    OLD=8+:111111++:111111+18+20++++STEEL WOOL ASST F/M/C PK3          .'
    OLD=9+:111111++:111111+10+15++++DETAIL PAPER COARSE 105MM          P'
    OLD=10+:111111++:111111+10+15++++DETAIL PAPER MEDIUM 105MM          P'
    OLD=11+:111111++:111111+10+15++++DETAIL PAPER FINE 105MM            P'
    OLD=12+:111111++:111111+10+60++++ECCENTRIC PAPER ASSORTED 125MM     P'
    OTR=12+212'
    MTR=18'
    MHD=4+ORDTLR:4'
    OFT=2'
    MTR=3'
    END=4'
    STX=ANA:1+xxxxxxxxx:xxxxxxxxxx:xxxxxxxxxx+051214:234834+50008400000392+        +ORDHDR+B'
    MHD=1+ORDHDR:6'
    TYP=0430'
    SDT=xxxxxxxxxx:xxxx+xxxxxxxxxx++577820309'
    CDT=xxxxxxxxxx+xxxxxxx'
    DNA=1++073:GBP'
    FIL=336+1+051214'
    MTR=7'
    MHD=2+ORDERS:8'
    CLO=:WGN800++:Trent Road::Grantham:NG31 7XQ'
    ORD=20204101::051214'
    DIN=051216'
    OLD=1+5010352229405:22900020++:25396218+15+980+6200+++10 SHT OAKEY GL/PAPER 230X280MM    ASST'
    DNB=1+1++::::::043:1'
    OTR=1+980'
    MTR=8'
    MHD=3+ORDTLR:4'
    OFT=1'
    MTR=3'
    END=3'
    J'espère que ce n'est pas trop long ???

    Est ce que ton script collera avec l'exemple ci-dessous ?
    Ci oui, c'est génial, tu me soulageras beaucoup pour mes vancances !!!! ;o))))))
    tout le monde est d'accord pour critiquer la pensée unique

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    bah teste déjà le code donné ci dessus et tu me dis?
    pendant ce temps, je teste avec tes fichiers. 8)

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bon voilà le script fini, il marche comme tu veux (vive le secret et la puissance des regex 8) 8) ).
    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
     
    #!/usr/bin/perl -w
    use strict;
    use Carp;
     
    my $fic_in='c:\wsta\m-sga400.r';
    my $fic_out_edifact='c:\wsta\m-atlas.r';
    my $fic_out_tradacom='c:\wsta\m-sga400.r2';
     
    open (FILE, $fic_in) or die "Impossible d'ouvrir $fic_in\n$!\n";
    my @file = <FILE>;
    close(FILE);
    my $les_lignes = join("",@file);
    my @bloc1 = $les_lignes =~ /^(STX=ANA.+?END=\d.+?$)/msgi;
    my @bloc2 = $les_lignes =~ /^(UNB\+UNOA.+?UNZ\+.+?$)/msgi;
    open(FF1,">$fic_out_tradacom") or die "Impossible d'ecrire dans $fic_out_tradacom\n$!\n";
    open(FF2,">$fic_out_edifact") or die "Impossible d'ecrire dans $fic_out_edifact\n$!\n";
    print FF1 @bloc1;
    print FF2 @bloc2;
    close (FF1); 
    close(FF2);
    voilà une explication du script :
    Dans un premier temps, je mets ton fichier dans un tableau puis une variable grace à la fonction join. Rien de compliquer.

    L'astuce est la regex :
    Dans la variable, j'ai toutes les lignes du fichier avec des \n. Alors voulant recuperer celle commençant par STX=ANA par exemple, je mets comme pattern
    - le "^ STX=ANA", puis je specifie bien en option le "m" qui permet de traiter la chaîne comme des lignes multiples (confere la FAQ regex que j'ai ecrite).
    - .+?END=\d pour aller jusqu'au premier END=<chiffre> trouvé (d'où le .+?, sinon perl prendra tout jusqu'au dernier END=<chiffre> de la variable).
    - .+?$ afin de recuperer la ligne entiere où se trouve UNZ+.

    l'option "s" traite la chaine comme une ligne simple (le caractère . reconnaît aussi les sauts de ligne) et je recupere les \n.

    Voilà, et en ecrivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @bloc2 = $les_lignes =~ /...../msgi;
    l'option "g" permet de recuperer toutes les occurrencces et mettre chacune d'elle dans une case de mon tableau.

    tu peux enlever l'option "i" si tu veux!!!

    est ce clair ou non?
    courage

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Djibril,
    ton code marche parfaitement sur le fichier exemple (non modifié par rapport au post sur le forum) !!!

    J'obtiens bien deux fichiers distincts et je retrouve les deux commandes edifact dans l'un et tradacom dans l'autre !!!!

    C'est génial !! Merci beaucoup !!!

    En, un dernier petit truc à te demander, vu que tu fais les scripts en 5 lignes là où j'en mets 50 :
    y a t'il un moyen rapide de comparer le fichier source à la somme des deux fichiers générés, si c'est identique, on supprime le fichier source....
    tout le monde est d'accord pour critiquer la pensée unique

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    oui je pense!
    en comparant les tailles des fichiers (je sais pas si c'est propre). A une lettre pres la taille sera pas identique, à voir. reflechi de ton coté et propose une soluce 8) , c'est pas encore noel

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Oui c'est clair Djibril merci. Juste un truc, quand tu dis:
    - .+?UNZ\+ pour aller jusqu'au premier UNZ+ trouvé (d'où le .+?, sinon perl prendra tout jusqu'au dernier UNZ+ de la variable).
    tu veux dire

    - .+?END=\d.+ pour aller jusqu'au premier END=<chiffre> trouvé (d'où le .+?, sinon perl prendra tout jusqu'au dernier END=<chiffre> de la variable).
    plutôt non ? où j'ai rien compris

    Sinon, les regex sont vraiment puissantes et je comprends vraiment pourquoi perl est le langage le plus approprié pour le traitement des chaines de caractères !!

    Vive perl, vive ce forum et Merci mille fois !!!!!!!!!!!!!!!!!
    tout le monde est d'accord pour critiquer la pensée unique

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    oui t'as bien compris, je me suis gourré dans mon explication, je vais rectifier.
    Vive les regex et Perl 8)

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    [quote]
    oui je pense!
    en comparant les tailles des fichiers (je sais pas si c'est propre). A une lettre pres la taille sera pas identique, à voir. reflechi de ton coté et propose une soluce 8) , c'est pas encore noel
    [quote]

    J'me disais ptere qu'en faisant ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if($#bloc1+$#bloc2==($#file-1))
    {
            unlik($fic_in);
    }
    mais le problème, c'est que si dans mon fichier $fic_in, y a des retour chariot à lafin, au tout début ou entre chaque fin de bloc et début de nouveau bloc, la somme des $#bloc1 et $#bloc2 sera différente de $#file, je pense ....

    PS: c'est pas encore noël, mais tu m'as fait un beau cadeau qd mem !
    tout le monde est d'accord pour critiquer la pensée unique

  12. #12
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    je viens de m'apercevoir d'un tout petit truc, au faite le script fonctionne bien à la seul difference qu'il m'enleve les \n entre chaque case de mon tableau du coup c'est moins beau dans tes fichiers car ça fait un truc du genre :
    ...
    MTR=3'
    END=4'STX=ANA:1+xxxxxxxxxxxxxxxxxxxxxxxxxxx+051214:234834+50008400000392+ +ORDHDR+B'
    MHD=1+ORDHDR:6'
    ...
    donc pour que tout soit Ok, voici le script correct avec en cadeau de fin d'année les comparaison (déjà testé).
    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
     
    #!/usr/bin/perl -w
    use strict;
    use Carp;
     
    my $fic_in='c:\wsta\m-sga400.r';
    my $fic_out_edifact='c:\wsta\m-atlas.r';
    my $fic_out_tradacom='c:\wsta\m-sga400.r2';
     
    open (FILE, $fic_in) or die "Impossible d'ouvrir $fic_in\n$!\n";
    my @file = <FILE>;
    close(FILE);
    my $les_lignes = join("",@file);
    my @bloc1 = $les_lignes =~ /^(UNB\+UNOA.+?UNZ\+.+?$)/msgi;
    my @bloc2 = $les_lignes =~ /^(STX=ANA.+?END=\d.+?$)/msgi;
    open(FF1,">$fic_out_tradacom") or die "Impossible d'ecrire dans $fic_out_tradacom\n$!\n";
    open(FF2,">$fic_out_edifact") or die "Impossible d'ecrire dans $fic_out_edifact\n$!\n";
    foreach (@bloc1) {print FF1 $_,"\n";}
    foreach (@bloc2) {print FF2 $_,"\n";}
     
    close (FF1); 
    close(FF2);
     
    if ((-s $fic_in) == ((-s $fic_out_edifact) + (-s $fic_out_tradacom) - 2)) {
    	print "$fic_in supprime\n";
    	unlik($fic_in); 
    }
    le -2 dans le if pour chaque octet d'ajoute en fin des fichiers crées.
    Voilà!! 8)

  13. #13
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Remarquez qu'on peut remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    open (FILE, $fic_in) or die "Impossible d'ouvrir $fic_in\n$!\n";
    my @file = <FILE>;
    close(FILE);
    my $les_lignes = join("",@file);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    open (FILE, '<', $fic_in) or die "Impossible d'ouvrir $fic_in\n$!\n";
    my $les_lignes;
    { local $/; $les_lignes = <FILE>; }
    close(FILE);
    qui est plus efficient parce qu'il ne cherche pas à découper le fichier avant de le remettre en un morceau. Ici vu la taille des fichiers, cela n'a pas beaucoup d'importance, mais pourrait en avoir s'ils étaient plus gros (ou s'il y en avait énormément à traiter).

    --
    Jedaï

  14. #14
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    j'avais oublié cette variable spéciale $/ qui sépare les enregistrements en entrée. Et par défaut, elle vaut \n.
    Merci jedai.
    Tu devrais rajouter celà dans le post it d'optimisation jedai, ça peut toujours ettre utile de s'en souvenir!!!!

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Merci pour toutes ces informations. J'ai modifié le script en fonction.
    J'avais remarqué qu'il n'y avait pas de retour chariot à la fin de chaque bloc et l'avais modifié car ça faisait planté le traducteur.

    Merci à tous et vive ce forum.

    Bone fin de journée.
    tout le monde est d'accord pour critiquer la pensée unique

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

Discussions similaires

  1. petit problème d'expression régulière
    Par stoyak dans le forum Langage
    Réponses: 5
    Dernier message: 16/05/2006, 11h20
  2. Problème d'expression régulière
    Par SiM07 dans le forum Langage
    Réponses: 2
    Dernier message: 02/12/2005, 17h57
  3. Problème d'expression régulière
    Par Pymm dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 11/10/2005, 15h04
  4. [RegEx] Petit Bug sur Expression Régulière
    Par Delphy113 dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2005, 20h48
  5. Problème d'expression régulière
    Par Neitsa dans le forum Général Python
    Réponses: 3
    Dernier message: 11/08/2005, 14h29

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