Noob perl avec pb, mais j'apprend doucement

Noob perl avec pb, mais j'apprend doucement - Perl - Programmation

Marsh Posté le 30-05-2008 à 08:27:10    

Bonjour,  
Bon je suis noob en perl, j'ai un petit pb d'extraction de lignes dans un fichier texte qui se présente comme ça :  
 
2008  Nom Prénom indice
Capacité : validée
2008  Nom Prénom indice
Capacité :  En cours
2008  Nom Prénom indice
Capacité :  Echec
 
Bref j'ai ecrit un script perl de la sorte  

Code :
  1. open(FE,"resultat.txt" )|| die "Pas lu";
  2. while (<FE> )
  3. {
  4. if($_=~/2008//\n)
  5. {
  6. print $_;
  7. }
  8. }


 
 
Sans problème j'extrais la ligne 1 mais je ne trouve pas comment extraire la ligne deux en dessous séquentiellement
Je ne cherche qu'a sortir les enregistrements de 2008 car le fichier contient 10 années !
au final j'aimerais :  

Code :
  1. 2008  Nom Prénom indice
  2. Capacité :  En cours
  3. 2008  Nom Prénom indice
  4. Capacité :  Echec


Merci de votre aide , je rame !

Reply

Marsh Posté le 30-05-2008 à 08:27:10   

Reply

Marsh Posté le 30-05-2008 à 08:32:38    

C'est de la programmation, je transfère sur la section idoine.


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 30-05-2008 à 08:32:53    

Ce sujet a été déplacé de la catégorie OS Alternatifs vers la categorie Programmation par Black_lord


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 30-05-2008 à 09:28:25    

ok


---------------
Astro, photo, macro, brico, dodo
Reply

Marsh Posté le 30-05-2008 à 09:51:36    

perl -e 'while (<> ) { if (/^2008/) { print; print scalar <> } }'

Reply

Marsh Posté le 30-05-2008 à 23:43:09    

Une version un poil moins tricky:

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. open my $FE, '<', "resultat.txt" or die "Pas lu\n";
  5. my $printnext = 0;
  6. while (<$FE> ) {
  7.     if ($printnext) {
  8.         $printnext = 0;
  9.         print;
  10.         next;
  11.     }
  12.     if (/^2008/) {
  13.         $printnext = 1;
  14.         print;
  15.         next;
  16.     }
  17. }
  18. close $FE;


A partir de la quelle tu peux écrire une version un poil plus complexe,
qui tient compte de cas incomplets (car les fichiers de donnée parfaits...):
seconde ligne apres une avec 2008 ne commençant pas par "Capacité :",
ce qui semble être une de tes contraintes, et cas de deux lignes successives
commençant par 2008.

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. open my $FE, '<', "resultat.txt" or die "Pas lu\n";
  5. my $printnext = 0;
  6. while (<$FE> ) {
  7.     if ($printnext) {
  8.         unless (/^Capacité :/) {
  9.             if (/^2008/) {
  10.                 print " !! PAS DE CAPACITE!! \n";
  11.                 print;
  12.                 $printnext = 1;
  13.                 next;
  14.             }
  15.             chop;
  16.             print;
  17.             print " !!PAS DE CAPACITE!! \n";
  18.             $printnext = 0;
  19.             next;
  20.         }
  21.         print;
  22.         $printnext = 0;
  23.         next;
  24.     }
  25.     if (/^2008/) {
  26.         print;
  27.         $printnext = 1;
  28.         next;
  29.     }
  30. }
  31. close $FE;


 
Ou le code équivalent (pour une fois qu'on peut employer un redo, ce qui est rare, on ne va pas se gêner)

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. open my $FE, '<', "resultat.txt" or die "Pas lu\n";
  5. my $printnext = 0;
  6. while (<$FE> ) {
  7.     if ($printnext) {
  8.         $printnext = 0;
  9.         unless (/^Capacité :/) {
  10.             if (/^2008/) {
  11.                 print " !! PAS DE CAPACITE!! \n";
  12.                 redo;
  13.             }
  14.             chop;
  15.             print;
  16.             print " !!PAS DE CAPACITE!! \n";
  17.             next;
  18.         }
  19.         print;
  20.     }
  21.     if (/^2008/) {
  22.         $printnext = 1;
  23.         print;
  24.     }
  25. }
  26. close $FE;


Si on se permet de mettre me message d'erreur en tête de ligne, et non en bout de ligne erronnée (ou vide) comme précédemment, on aboutit a un script un peu plus élégant:

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. open my $FE, '<', "resultat.txt" or die "Pas lu\n";
  5. my $printnext = 0;
  6. while (<$FE> ) {
  7.     if ($printnext) {
  8.         $printnext = 0;
  9.         unless (/^Capacité :/) {
  10.             print " !! PAS DE CAPACITE!! ";
  11.             if (/^2008/) {
  12.                 print "\n";
  13.                 redo;
  14.             }
  15.         }
  16.         print;
  17.     }
  18.     if (/^2008/) {
  19.         $printnext = 1;
  20.         print;
  21.     }
  22. }
  23. close $FE;


A+,


Message édité par gilou le 31-05-2008 à 17:49:25

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

Marsh Posté le 31-05-2008 à 08:24:58    

ouch grand merci pour ces exemples fournis !  


---------------
Astro, photo, macro, brico, dodo
Reply

Marsh Posté le 31-05-2008 à 17:47:04    

Damned, j'ai oublié les close en fin de script. Je les rajoute dans mon post précédent.
C'est pas bien grave, mais autant écrire du code propre.
A+,


Message édité par gilou le 31-05-2008 à 17:50:18

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

Sujets relatifs:

Leave a Replay

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