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.