Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2806 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Noob perl avec pb, mais j'apprend doucement

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Noob perl avec pb, mais j'apprend doucement

n°1739202
Gandalf la​ croute
Do it Yourself or Pay !
Posté le 30-05-2008 à 08:27:10  profilanswer
 

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 !

mood
Publicité
Posté le 30-05-2008 à 08:27:10  profilanswer
 

n°1739203
black_lord
Truth speaks from peacefulness
Posté le 30-05-2008 à 08:32:38  profilanswer
 

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
n°1739204
black_lord
Truth speaks from peacefulness
Posté le 30-05-2008 à 08:32:53  profilanswer
 

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
n°1739240
Gandalf la​ croute
Do it Yourself or Pay !
Posté le 30-05-2008 à 09:28:25  profilanswer
 

ok


---------------
Astro, photo, macro, brico, dodo
n°1739256
matafan
Posté le 30-05-2008 à 09:51:36  profilanswer
 

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

n°1739569
gilou
Modérateur
Modzilla
Posté le 30-05-2008 à 23:43:09  profilanswer
 

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é!  --
n°1739596
Gandalf la​ croute
Do it Yourself or Pay !
Posté le 31-05-2008 à 08:24:58  profilanswer
 

ouch grand merci pour ces exemples fournis !  


---------------
Astro, photo, macro, brico, dodo
n°1739722
gilou
Modérateur
Modzilla
Posté le 31-05-2008 à 17:47:04  profilanswer
 

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é!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Noob perl avec pb, mais j'apprend doucement

 

Sujets relatifs
recupération page web en perlLancement script PHP depuis script PERL
Urgent ! Appel d'une page html en perlQuestions de noob
Comment faire un menu en Perl sans module externe ?Perl :comment forcer une variable sur un certain nombre de caractères?
Perl et FTP : Aller dans un sous dossier et le créer s'il existe pas..Ensemble des parties en Perl
[c#] objets -- peut être une question de noob[PERL] probleme avec foreach et l'ascii 10
Plus de sujets relatifs à : Noob perl avec pb, mais j'apprend doucement


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR