A voir également:
- [PERL] Extraire le contenu d'un fichier
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Extraire une video youtube - Guide
- Ouvrir un fichier .bin - Guide
12 réponses
blux
Messages postés
26650
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 février 2025
3 326
10 déc. 2007 à 10:25
10 déc. 2007 à 10:25
Salut,
un truc m'échappe : tu es obligé de conserver les données que tu as déjà lues pour les mettre dans le bon fichier, vu que la balise type_msg n'est présente qu'au milieu de la balise cre, comment fais-tu ?
un truc m'échappe : tu es obligé de conserver les données que tu as déjà lues pour les mettre dans le bon fichier, vu que la balise type_msg n'est présente qu'au milieu de la balise cre, comment fais-tu ?
Bonjour,
oui je suis obligé de conserver les données déjà lues, puisque l'interieur des balises varie en fonction du type_msg. Celà me permet de rediriger tous les 103 dans un fichier, puis de les traiter avec un parser, idem avec les 202 et 204.
while ( $fic =~ m/<cre>/gmc ){
print "Lecture du Fichier : \n";
if ($fic =~ / \G(.*?<type_msg>103.*?<\/cre>)/){
Pour répondre à ton autre question, justement je ne suis pas sûr que celà soit bon, mais voici pourquoi j'ai fait cà :
while ( $fic =~ m/<cre>/gmc ){
print "Lecture du Fichier : \n";
if ($fic =~ / \G(.*?<type_msg>103.*?<\/cre>)/){
"m/ ... /gmc", me fait une recherche global dans tous le fichier et multiligne. \G (assertion) me permet de recuperer ce qui commence par
<cre> et finit par ".*?<type_msg>103.*?</cre>" et de le rediriger. La position est sauvegardé, et on continue le traitement du fichier en recommencant à la balise <cre> suivante.
oui je suis obligé de conserver les données déjà lues, puisque l'interieur des balises varie en fonction du type_msg. Celà me permet de rediriger tous les 103 dans un fichier, puis de les traiter avec un parser, idem avec les 202 et 204.
while ( $fic =~ m/<cre>/gmc ){
print "Lecture du Fichier : \n";
if ($fic =~ / \G(.*?<type_msg>103.*?<\/cre>)/){
Pour répondre à ton autre question, justement je ne suis pas sûr que celà soit bon, mais voici pourquoi j'ai fait cà :
while ( $fic =~ m/<cre>/gmc ){
print "Lecture du Fichier : \n";
if ($fic =~ / \G(.*?<type_msg>103.*?<\/cre>)/){
"m/ ... /gmc", me fait une recherche global dans tous le fichier et multiligne. \G (assertion) me permet de recuperer ce qui commence par
<cre> et finit par ".*?<type_msg>103.*?</cre>" et de le rediriger. La position est sauvegardé, et on continue le traitement du fichier en recommencant à la balise <cre> suivante.
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 569
10 déc. 2007 à 12:43
10 déc. 2007 à 12:43
Salut,
met ton fichier sur cjoint.com et je vais regarder ce soir
met ton fichier sur cjoint.com et je vais regarder ce soir
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 569
10 déc. 2007 à 20:17
10 déc. 2007 à 20:17
Salut,
essai comme ça
essai comme ça
#!/usr/bin/perl use strict;use warnings; open LIRE,"ton_fichier" or die "E/S : $!\n"; my (@fic,@res); while(<LIRE>){ push @fic,$_ if /<cre>/ .. /<\/cre>/; } @res = split /<\/cre>/, join "",@fic; pop @res; foreach (@res){ $_ =~ />(\d{3})</; open ECRIRE,">>$1.txt" or die "E/S : $!\n" if $1; print ECRIRE "$_</cre>" if $1; close ECRIRE; } __END__
D'accord je vais essayer. Merci.
Voici le fichier original :
https://www.cjoint.com/?mku712a8jR
Voici le fichier original :
https://www.cjoint.com/?mku712a8jR
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 569
10 déc. 2007 à 21:07
10 déc. 2007 à 21:07
Ce n'est pas le script que j'ai besoin, mais le fichier à traiter ;-)
Impressionnant :)
Celà fonctionne nickel. Je vais tâcher de comprendre cà :)
Mais de visu si je décide que tout ce qui n'est pas 103,202,204 soit dans un fichier IND, il faut qu'après "$_ =~ />(\d{3})</;"
je fasse un test comme cà : (débutant en perl, je ne suis pas sur que
foreach (@res){
$_ =~ />(\d{3})</;
if($1 != '103' || $1!='202' || $1!='204')
{
open ECRIRE, ">>IND.txt" or die "E/S : $!\n" if $1;
print ECRIRE "$_</cre>" if $1;
}
else
{
open ECRIRE,">>$1.txt" or die "E/S : $!\n" if $1;
print ECRIRE "$_</cre>" if $1;
close ECRIRE;
}
}
Celà fonctionne nickel. Je vais tâcher de comprendre cà :)
Mais de visu si je décide que tout ce qui n'est pas 103,202,204 soit dans un fichier IND, il faut qu'après "$_ =~ />(\d{3})</;"
je fasse un test comme cà : (débutant en perl, je ne suis pas sur que
foreach (@res){
$_ =~ />(\d{3})</;
if($1 != '103' || $1!='202' || $1!='204')
{
open ECRIRE, ">>IND.txt" or die "E/S : $!\n" if $1;
print ECRIRE "$_</cre>" if $1;
}
else
{
open ECRIRE,">>$1.txt" or die "E/S : $!\n" if $1;
print ECRIRE "$_</cre>" if $1;
close ECRIRE;
}
}
blux
Messages postés
26650
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 février 2025
3 326
10 déc. 2007 à 21:16
10 déc. 2007 à 21:16
Fais gaffe, lami20j est redoutable quand il faut de la syntaxe qu'on dirait un tirage des chiffres et des lettres... :-)
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 569
>
blux
Messages postés
26650
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 février 2025
10 déc. 2007 à 22:39
10 déc. 2007 à 22:39
;-))
Arf celà va être plus compliqué :( Bon, je vais tâcher de t'en créer un vite fait. Le voici :
https://www.cjoint.com/?mkvptvBPUD
C'est loin d'être le fichier original (le fichier XML original est au taf).
https://www.cjoint.com/?mkvptvBPUD
C'est loin d'être le fichier original (le fichier XML original est au taf).
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 569
10 déc. 2007 à 21:48
10 déc. 2007 à 21:48
#!/usr/bin/perl use strict;use warnings; open LIRE,"toto.txt" or die "E/S : $!\n"; my (@fic,@res); while(<LIRE>){ push @fic,$_ if /<cre>/ .. /<\/cre>/; } @res = split /<\/cre>/, join "",@fic; pop @res; foreach (@res){ $_ =~ />(\d{3})</; if ($1 eq 103 || $1 eq 202 || $1 eq 204){ open ECRIRE,">>$1.txt" or die "E/S : $!\n" if $1; print ECRIRE "$_</cre>" if $1; } else { open IND,">>IND.txt" or die "E/S : $!\n" if $1; print IND "$_</cre>" if $1; } close IND; close ECRIRE; } __END__ou encore
#!/usr/bin/perl use strict;use warnings; open LIRE,"toto.txt" or die "E/S : $!\n"; my (@fic,@res); while(<LIRE>){ push @fic,$_ if /<cre>/ .. /<\/cre>/; } @res = split /<\/cre>/, join "",@fic; pop @res; foreach (@res){ $_ =~ />(\d{3})</; if ($1 =~ /(103|20[24])/){ open ECRIRE,">>$1.txt" or die "E/S : $!\n" if $1; print ECRIRE "$_</cre>" if $1; } else { open IND,">>IND.txt" or die "E/S : $!\n" if $1; print IND "$_</cre>" if $1; } close IND; close ECRIRE; } __END__