PERL

Résolu/Fermé
flongo Messages postés 53 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 9 décembre 2009 - 6 avril 2009 à 12:13
flongo Messages postés 53 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 9 décembre 2009 - 6 avril 2009 à 16:59
Bonjour,

J'utilise PERL pour faire du parsing.
Je cherche à extraire un texte qui commence soit par le mot 'Reception' soit 'type' et qui termine par 'FIN IMPORT'.
Lorsqu'un bloc est trouvé (ayant pour debut soit 'Reception' soit 'type' et pour fin 'FIN IMPORT'), je veux qui'il l'ecrive dans un fichier txt.

Voici le code que j'ai écrit mais sans succes :

open FICHIER,"<P:\\Prog_perl\\edital_pivot1.txt" or die "Ce fichier n'existe pas!";
open WRITER, ">P:\\Prog_perl\\infos_pivot1.txt" or die "Le fichier ne peut etre édité!";
my $Ligne;
while ($Ligne=<FICHIER>)

{
if ($Ligne =~/(Reception)-(.*) .FIN IMPORT/)
{
print WRITER $fichier;
}

}
while ($fichier = <FICHIER>)
{
print $fichier;
}
close fichier;

Quelqu'un peut il m'aider a trouver l'erreur, je suis novice dans ce langage.

Merci bien.

7 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
6 avril 2009 à 12:34
Salut,
Reception et FIN IMPORT sont sur la même ligne ?
Si c'est le cas, essais :
if($Ligne=~/Reception (.*) FIN IMPORT/) {
     print WRITER $1;
}

Cdlt
0
flongo Messages postés 53 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 9 décembre 2009
6 avril 2009 à 12:35
Non ils ne sont pas sur la meme ligne!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
6 avril 2009 à 14:03
Dans ce cas-là, utilise plutôt :
my @lignes=<FICHIER>:
my $ligne=join('',@lignes); # pour tout mettre le fichier dans $ligne

print $1 if ($ligne =~ /Reception (.*) FIN IMPORT/s);

close(FICHIER);
0
flongo Messages postés 53 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 9 décembre 2009
6 avril 2009 à 14:52
Excuse moi, je me suis trompé de prog: voila ce que tu m'as dit de mettre mais ca fonctionne tjrs pas:


open FICHIER,"<P:\\Prog_perl\\edital_pivot1.txt" or die "Ce fichier n'existe pas!";

my @lignes=<FICHIER>;
my $ligne=join('',@lignes); # pour tout mettre le fichier dans $ligne

if ($ligne =~/ Reception (.*) FIN IMPORT /s){
print $ligne; # en mettant ici print $1 ca ne fonctionne pas non plus
}

close (FICHIER);
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
6 avril 2009 à 16:53
Salut,
Ben, au lieu de faire un join pourquoi pas utiliser le mode slurp

Au lieu de
my @lignes=<FICHIER>:
my $ligne=join('',@lignes);


{  undef $/ and $fichier=<FICHIER>; }

Mais plus élégant c'est d'utiliser la lecture par paragraphes http://www.commentcamarche.net/forum/affich 11868354 perl?#7
0
flongo Messages postés 53 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 9 décembre 2009
6 avril 2009 à 14:40
Merci pour ton aide! Ca fonctionne tjrs pas! Le fichier txt que je veux créer ne se fait pas. Je te remet le code, il doit y avoir une erreur mais je la vois pas:

print "BIENVENUE DANS L EXTRACTION DES INFORMATIONS DANS LES LOGS!\n";

open FICHIER,"<P:\\Prog_perl\\edital_pivot1.txt" or die "Ce fichier n'existe pas!";
open WRITER, ">P:\\Prog_perl\\infos_pivot1.txt" or die "Le fichier ne peut etre édité!";
my $Ligne;

while ($Ligne=<FICHIER>) {

if ($Ligne =~/Reception (.*) FIN IMPORT/s){
print $1;
}
}
close FICHIER;
close WRITER;


open FICHIER,"<P:\\Prog_perl\\infos_pivot1.txt" or die "Le fichier n'existe pas !";
while ($ligne = <FICHIER>){
print $ligne;
}
close FICHIER;

Merci pour ton aide.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
6 avril 2009 à 15:21
S'il n'y a rien dans le fichier WRITER, c'est normal, j'ai mis print $1, pour afficher à l'écran à titre d'exemple.
Si tu veux écrire dans le fichier :

if ($Ligne =~/Reception (.*) FIN IMPORT/s){
print WRITER $1;
}

Cdlt
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
squall289 Messages postés 98 Date d'inscription mardi 31 mars 2009 Statut Membre Dernière intervention 29 mai 2009 13
6 avril 2009 à 14:53
le soucis viens je pense de la capture du texte :
if ($Ligne =~/Reception (.*) FIN IMPORT/s) Je pense qu'il faut mettre des guillemets à FIN IMPORT et Reception.
Fais un test de capture simple avec et sans guillements pour tester.
Le code de fiddy est bon, normalement ça devrait marcher.
0
flongo Messages postés 53 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 9 décembre 2009
6 avril 2009 à 15:09
Salut,

J'ai fait ce que tu m'as conseillé:

open FICHIER,"<P:\\Prog_perl\\edital_pivot1.txt" or die "Ce fichier n'existe pas!";

my @lignes=<FICHIER>;
my $ligne=join('',@lignes); # pour tout mettre le fichier dans $ligne

print $1 if ($ligne =~ / "Reception" (.*) "FIN IMPORT" /s);


close (FICHIER);

Mais ca fonctionne pas!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
6 avril 2009 à 15:14
Ah non pas de guillemets lol, ça va tuer la regexp ^^.
0
flongo Messages postés 53 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 9 décembre 2009 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
6 avril 2009 à 15:25
ok
Voila ce que j'ai mis et ca fonctionne tjs pas :

print "BIENVENUE DANS L EXTRACTION DES INFORMATIONS DANS LES LOGS!\n";

open FICHIER,"<P:\\Prog_perl\\edital_pivot1.txt" or die "Ce fichier n'existe pas!";

my @lignes=<FICHIER>;
my $ligne=join('',@lignes); # pour tout mettre le fichier dans $ligne

print $1 if ($ligne =~ / Reception (.*) FIN IMPORT /s);


close (FICHIER);

Le pbme peut etre du à quoi?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > flongo Messages postés 53 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 9 décembre 2009
6 avril 2009 à 15:31
C'est quoi qui ne marche pas ? Le fait qu'il n'y est rien d'écrit dans le fichier WRITER ?
Si tel est le cas, c'est normal car j'ai mis print $1 pour afficher sur l'écran à titre d'exemple.
Pour mettre dans le fichier, utilise : print WRITER $1;
0
flongo Messages postés 53 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 9 décembre 2009 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
6 avril 2009 à 15:38
Je t'explique ce qui ne fonctionne pas: lorsque je mets print $1, l'affichage sur l'ecran ne se fait pas.
Maintenant quand je mets print WRITER $1, ca ne fonctionne pas non plus.
Donc au final j'ai essayé cela:

open FICHIER,"<P:\\Prog_perl\\edital_pivot1.txt" or die "Ce fichier n'existe pas!";
open WRITER, ">P:\\Prog_perl\\1.txt" or die "Le fichier ne peut etre édité!";

my @lignes=<FICHIER>;
my $ligne=join('',@lignes); # pour tout mettre le fichier dans $ligne

print WRITER $1 if ($ligne =~ / Reception (.*) FIN IMPORT /s);
close (FICHIER);
close (WRITER);

open FICHIER,"<P:\\Prog_perl\\1.txt" or die "Le fichier n'existe pas !";
while ($sor = <FICHIER>){
print $sor;
}
close (FICHIER);

Ce ne fonctionne pas non plus.
Merci de ton aide
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
6 avril 2009 à 14:58
Salut,

while (<FICHIER>) {
    print if /Reception/ .. /FIN IMPORT/;
}
--
106485010510997108
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
6 avril 2009 à 16:56
Re,

Essaie comme ça ;-)
open FICHIER,"P:\\Prog_perl\\edital_pivot1.txt" 
      or die "Ce fichier n'existe pas!";
open WRITER, ">P:\\Prog_perl\\infos_pivot1.txt" 
      or die "Le fichier ne peut etre édité!";

while (<FICHIER>) {
    print WRITER if /Reception/ .. /FIN IMPORT/;
}
__END__
0
flongo Messages postés 53 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 9 décembre 2009
6 avril 2009 à 16:59
Super
Ca marché.
Je te remercie bcp!
0