[RESOLU][PERL] Extraire chaines multiples dans une fichier

Extraire chaines multiples dans une fichier [RESOLU][PERL] - Perl - Programmation

Marsh Posté le 08-06-2014 à 21:01:58    

Bonjour,
 
Je début en Perl et je ne parviens pas à effectuer une opération de routine. Je veux extraire d'un fichier texte toutes les chaines contenus entre deux limiteurs.
 
Le code l'expliquera mieux que moi:

Code :
  1. use strict;
  2. use warnings;
  3. my $content;
  4. my $limiteur_arg1='<strong>';
  5. my $limiteur_arg2='</strong>';
  6. open(TOTO,"test-parsing.html" ) || die ("Erreur d'ouverture de TOTO" ) ;
  7. while (<TOTO> ) {
  8. $content.= $_ ;
  9. }
  10. close(TOTO);
  11. #on enlève les espaces et sauts de lignes
  12. $content =~ s/\n//g;
  13. $content =~ s/\s+//;
  14. my @matched = $content =~ /$limiteur_arg1(.*?)$limiteur_arg2/;
  15. print $matched[0]; # il est bien possible d'extraire une chaine mais comment les extraire toutes ?
  16. open($fh,">>log.txt" ); #on sauvegarde tout dans un fichier
  17. print $fh $matched[0];


 
J'arrive à extraire une chaîne mais le fichier en questions en comporte des centaines. Je n'arrive pas à créer une boucle pour tout extraire intelligemment.
 
Merci d'avance pour votre aide.


Message édité par aa450553 le 08-06-2014 à 23:41:37
Reply

Marsh Posté le 08-06-2014 à 21:01:58   

Reply

Marsh Posté le 08-06-2014 à 21:11:50    

il faut que tu fasses une boucle autour du pattern mattching avec la balise g
 

Code :
  1. open($fh,">>log.txt" ); #on sauvegarde tout dans un fichier
  2. while(my @matched = ($content =~ /$limiteur_arg1(.*?)$limiteur_arg2/g)) {
  3.       print $matched[0]; # il est bien possible d'extraire une chaine mais comment les extraire toutes ?
  4.      print $fh $matched[0];
  5. }


 
(mais je n'ai pas testé le code, c'est l'esprit général)


Message édité par dreameddeath le 08-06-2014 à 21:13:14
Reply

Marsh Posté le 08-06-2014 à 21:24:35    

Merci pour ta réponse.
 
J'obtiens une boucle infinie sur une seule des entrées que je veux extraire. Je ne comprends pas pourquoi. Une idée ?

Reply

Marsh Posté le 08-06-2014 à 22:08:07    

Un truc comme ceci devrait le faire:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. use File::Slurp;
  7. my $content = read_file("test-parsing.html" );
  8.  
  9. #on enlève les espaces et sauts de lignes
  10. $content =~ s/\n|\s+//g;
  11.  
  12. my $limiteur_arg1 = '<strong>';
  13. my $limiteur_arg2 = '</strong>';
  14. my @matched = ($content =~ /$limiteur_arg1(.*?)$limiteur_arg2/g);
  15.  
  16. print join("\n", @matched);


Note: il ne traite pas le cas d'un <strong>...<strong>...</strong>...</strong> imbriqué qui nécessite un traitement plus complexe (il ne s'occupera que du premier niveau)
si tu veux imprimer la liste dans un fichier ouvert dont le handle est $fh, faire:
print $fh "$_\n" foreach (@matched);
 
A+,


Message édité par gilou le 09-06-2014 à 12:23:24

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

Marsh Posté le 08-06-2014 à 23:39:46    

Merci Gilou, c'est tout bon.
 
Bonne soirée ++

Reply

Marsh Posté le 09-06-2014 à 12:25:04    

Je viens de voir en le relisant qu'il y avait une fôte de frappeuh:
/)g; au lieu de /g);
 
A+,


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