comment extraire plusieurs chaine de caracteres d'un fichier ???

comment extraire plusieurs chaine de caracteres d'un fichier ??? - Shell/Batch - Programmation

Marsh Posté le 19-04-2011 à 10:57:32    

Bonjour
je suis nouveau dans la programation en shell aussi je vous remercie par avance.
ma question est la suivante:  
j'ai un fichier avec un nom XYZ.xxx
a l'interieur de ce fichier j'ai plusieurs ligne de caracteres sous forme de blocs:
1er blocs
sabb 56 hfjgkfjsdh
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
nnnn
2eme blocs
ftnc 76 fhgjfgklsdls
yyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyy
nnnn
3eme blocs
xynz 87 fjhfjgkfldl
wwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwww
nnn
.
.
.
etc
x blocs de caracteresl
e fichier se termine sur le dernier blocs par nnnn
 
comment puis je extraire chaque x block de caractere commencant (par exmeple le 3eme blocs)
xynz 87 fjhfjgkfldl et finissant par nnnn ???? comment puis je egalement ecrire chacun de ces blocs dans des fichier texte dont les nom de chacun des ces fichiers sera la 1er ligne de caractere du bloc extrait ???
j'ai quelques idée mais je ne sais pas trop par ou commencer
merci par avance de l'aide fourni

Reply

Marsh Posté le 19-04-2011 à 10:57:32   

Reply

Marsh Posté le 19-04-2011 à 10:58:59    

je precise que je voudrais automatiser cette operation

Reply

Marsh Posté le 19-04-2011 à 13:10:24    

Pourquoi vouloir faire ça en shell/batch? Il y a une contrainte spécifique?
Il y a tout un tas de langages interprétés comme perl, python, voire même awk qui me paraissent plus adaptés pour ce type de tache.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-04-2011 à 22:15:31    

merci pour cette &er reponse
je ne connais pas perl mais awk oui, et je suis prenneur de toutes solutions.....

Reply

Marsh Posté le 20-04-2011 à 10:30:23    

Bon alors, il faudrait nous expliquer comment un bloc est délimité dans le fichier:
Les blocs sont séparés par une ligne vide?
La première ligne d'un bloc c'est du texte, un blanc, des chiffres, un blanc, du texte?
La dernière ligne d'un bloc est "nnnn" pour tous les blocs?

 

A+,


Message édité par gilou le 20-04-2011 à 10:32:17

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-04-2011 à 12:41:06    

alors la 1er ligne c'est obligatoirement 6 lettre, 1 espace, 2 chiffre, 1 espace, 6 lettres
les ligne suivantes sont aleatoirement des chiffres et des lettres avec des espaces
la derniere ligne de chaque block est obligatoirement: nnnn
voili voila

Reply

Marsh Posté le 20-04-2011 à 12:42:51    

oups desolé j'oubliais, il y a une ligne vide entre chaque block (apres le nnnn ou avant la 1er ligne de chaque block de données)

Reply

Marsh Posté le 20-04-2011 à 21:29:30    

Désolé, une coupure de courant pendant que je rédigeais ma réponse vers 13h30 m'avait arrété dans mes élans.
 
Voici un exemple de solution possible en perl, a adapter a ses besoins:
 

Code :
  1. #!/usr/bin/perl
  2. #fichier blocksfile.pl
  3. use strict;
  4. use warnings;
  5. use autodie qw(open close);   # open/close succeed or die
  6.  
  7. my $filename = "blocksfile.txt"; #nom du fichier en entrée
  8. open my $fh, '<', $filename;
  9. my $savedprefix = "savedblock"; #préfixe des fichiers sauvés
  10. my $savedfh;
  11. my $inblock = 0; #flag pour savoir si la ligne est dans un bloc ouvert
  12. my $numblock = 0; # compte des débuts de blocs rencontrés
  13. while (<$fh> ) {
  14.  if (/^.{6}\s\d{2}\s.{6}$/o) { #pattern de ligne pour 6 caracteres, un blanc, deux chiffres, un blanc, 6 caracteres
  15.    if ($inblock) { # on a trouvé un début alors qu'on est déja dans un bloc ouvert
  16.      print "Warning: Block $numblock incorrectly closed:skipped\n";
  17.      close $savedfh;
  18.      unlink $savedprefix.$numblock.".txt"; #on efface le fichier de bloc incorrect
  19.    }
  20.    # bon on est maintenant prêt a traiter le cas de rencontre d'un nouveau bloc
  21.    $inblock = 1; # flag mis à 1
  22.    $numblock++; # cpteur incrémenté
  23.    open $savedfh, '>', $savedprefix.$numblock.".txt"; # on ouvre un nouveau fichier de block à sauver
  24.    binmode $savedfh; # mode binaire à tout hasard, comme je ne connais pas tes données
  25.    print $savedfh $_; # on écrit la ligne dans le fichier de block à sauver (pas clair si ca doit être fait dans ton cas)
  26.  }
  27.  elsif (/^nnnn$/) {
  28.    if ($inblock) { # on a rencontré une fin de block pour un block ouvert
  29.      print $savedfh $_; # on écrit la ligne dans le fichier de block à sauver (pas clair si ca doit être fait dans ton cas)
  30.      close $savedfh; #on ferme le fichier
  31.      $inblock = 0; #on positionne le flag a 0
  32.    }
  33.    # et traitement en erreur sinon?
  34.  }
  35.  elsif ($inblock) { #ligne standard dans un bloc ouvert
  36.    print $savedfh $_; # on écrit la ligne dans le fichier de block à sauver
  37.  }
  38. }
  39. close $fh;
  40. if ($inblock) {
  41.  print "Warning: Block $numblock incorrectly closed:skipped\n";
  42.  close $savedfh;
  43.  unlink $savedprefix.$numblock.".txt";
  44. }


J'ai testé sur un fichier exemple blocksfile.txt

sabbcc 56 hfjgkf
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx  
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx  
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx  
nnnn
2eme blocs  
ftncdd 76 fhgjfg
yyyyyyyyyyyyyyyyyyyyyyyyy  
yyyyyyyyyyyyyyyyyyyyyyyyy  
yyyyyyyyyyyyyyyyyyyyyyyyy  
nnnn
3eme blocs  
xynzee 87 fjhfjg
wwwwwwwwwwwwwwwwww  
wwwwwwwwwwwwwwwwww  
wwwwwwwwwwwwwwwwww  
nnnn


C:\Perl>perl blocksfile.pl
ça m'a donné trois fichiers en sortie:
savedblock1.txt

sabbcc 56 hfjgkf
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx  
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx  
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx  
nnnn


savedblock2.txt

ftncdd 76 fhgjfg
yyyyyyyyyyyyyyyyyyyyyyyyy  
yyyyyyyyyyyyyyyyyyyyyyyyy  
yyyyyyyyyyyyyyyyyyyyyyyyy  
nnnn


savedblock3.txt

xynzee 87 fjhfjg
wwwwwwwwwwwwwwwwww  
wwwwwwwwwwwwwwwwww  
wwwwwwwwwwwwwwwwww  
nnnn


A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-04-2011 à 06:05:21    

excellent je teste et te tiens au courrant.....merci  merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed