[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:
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.