|
|
|
|
Extraire le contenu d'un fichier avec perl
Dernière réponse le 24 jun 2008 à 03:02:44 titexe, le 27 nov 2006 à 20:29:08Bonjour,
nous recevons toujours des fichiers dans le format ci_dessous et on voudrait extraire que la derniére partie dans un autre fichier avec un script perl;
le format du fichier recus :
This is a multi-part message in MIME format.
------=_NextPart_000_0121_01C708D0.7AEEAB30
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 8bit
-----Message d'origine-----
De : KHALID MONCEF
Envoyé : mercredi 15 novembre 2006 15:49
À : 'pfe@gis.ma'
Objet : Envoi d'un message : OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl
Le message est prêt à être envoyé avec le fichier suivant ou les liens
joints :
OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl
Remarque : pour se protéger de virus informatiques, il se peut que les
programmes de messagerie électronique évitent d'envoyer ou de recevoir
certains types de pièces jointes. Vérifiez les paramètres de sécurité de
votre messagerie électronique pour déterminer de quelle manière les pièces
jointes sont gérées.
------=_NextPart_000_0121_01C708D0.7AEEAB30
Content-Type: application/octet-stream;
name="OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl"
@|99|OR|99|CT|200608091600|2006|212121||DD|TEST||||
D|2006|121201300030001011|08|1|1014|1365|xxxxx|1|1|10|10/01/2005|20/01=/2005||||||
D|2006|121201300030001012|08|1|1014|1365|xxxxxxx|1|2|11|10/01/2005|20/01=/2005||||||
D|2006|121201300000001040|08|1|1014|1365|xxxxxxx|2|3|15|15/01/2005|21/01=/2005||||||
D|2006|121201300000001060|08|1|1014|1365|xxxxxxxx|2|4|16|15/01/2005|21/01=/2005||||||
D|2006|320011300800001011|08|3200113008|1014|1365|4000000|3|5|12|12/01/2005|21/01/2005||||||
D|2006|320011300800001020|08|3200113008|1014|1365|4000000|3|6|13|13/01/2=2005|21/01/2005||||||
&|6|
---_NextPart_000_0121_01C708D0.7AEEAB30--
ce que nous voulons extraire , c'est juste la derniére partie:
filename="OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl"
@|99|OR|99|CT|200608091600|2006|212121||DD|TEST||||
D|2006|121201300030001011|08|1|1014|1365|xxxxx|1|1|10|10/01/2005|20/01=/2005||||||
D|2006|121201300030001012|08|1|1014|1365|xxxxxxx|1|2|11|10/01/2005|20/01=/2005||||||
D|2006|121201300000001040|08|1|1014|1365|xxxxxxx|2|3|15|15/01/2005|21/01=/2005||||||
D|2006|121201300000001060|08|1|1014|1365|xxxxxxxx|2|4|16|15/01/2005|21/01=/2005||||||
D|2006|320011300800001011|08|3200113008|1014|1365|4000000|3|5|12|12/01/2005|21/01/2005||||||
D|2006|320011300800001020|08|3200113008|1014|1365|4000000|3|6|13|13/01/2=2005|21/01/2005||||||
&|6|
D'avance merci,
je suis qu'un débutant , merci de m'aider a completer cette tache,
Cordialement.
Répondre à lami20j
|
Re, open F_LIRE,"fichier" or die "E/S : $!\n";J'ouvre une connexion(handle) du script vers le fichier appellé fichier En langage plus naturel, j'ouvre en lecture le fichier appellé fichier au lieu de fichier on peut aussi écrire /chemin/vers/fichier open F_LIRE,"/chemin/vers/fichier" or die "E/S : $!\n";J'appelle cette connexion (ouverture), F_LIRE open F_ECRIRE,">> resultat" or die "E/S : $!\n";J'ouvre une connexion(handle) du script vers le fichier resultat Il s'agit d'une ouverture en mode ajout. Le mode ajoute n'écrase pas le fichier s'il existe et il ajoute à la fin au lieu de resultat on peut écrire aussi /chemin/vers/resultat open F_ECRIRE,">> /chemin/vers/resultat" or die "E/S : $!\n";J'appelle cette connexion (ouverture en mode ajout), F_ECRIRE while(<F_LIRE>){
print F_ECRIRE if /^filename=/.../^\s*$/;
}Ici je lis le fichier ligne par ligne en utilisant l'opérateur diamant <> et le nom de ma connexion en lecture
et écrit dans resultat seulement le paragraphe compris entre filename= et la ligne vide après le paragraphe (donc ce que tu as besoin print F_ECRIRE if /^filename=/.../^\s*$/; veut dire écrit dans resultat si compris entre filename= et la ligne vide après le paragraphe close F_LIRE; close F_ECRIRE;fermeture de la connexion vers les fichiers une fois le travail terminé. Pour exécuter le script tu tapes simplement mon_script.plaprès avoir attribuer les droit d'exécution chmod a+x mon_script.plou perl mon_script.pllami20j |
Re,
|
Répondre à titexe
|
Salut,
filename="OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl" @|99|OR|99|CT|200608091600|2006|212121||DD|TEST|||| D|2006|121201300030001011|08|1|1014|1365|xxxxx|1|1|10|10/01/2005|20/01=/2005|||||| D|2006|121201300030001012|08|1|1014|1365|xxxxxxx|1|2|11|10/01/2005|20/01=/2005|||||| D|2006|121201300000001040|08|1|1014|1365|xxxxxxx|2|3|15|15/01/2005|21/01=/2005|||||| D|2006|121201300000001060|08|1|1014|1365|xxxxxxxx|2|4|16|15/01/2005|21/01=/2005|||||| D|2006|320011300800001011|08|3200113008|1014|1365|4000000|3|5|12|12/01/2005|21/01/2005|||||| D|2006|320011300800001020|08|3200113008|1014|1365|4000000|3|6|13|13/01/2=2005|21/01/2005|||||| &|6| mais en fait c'est filename="OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl" @|99|OB|99|CO|200608091600|2006|212121||DD|TEST|||| D|2006|121201300030001011|08|1|1014|1365|xxxxxxxx|1|1|10|10/01/2005|20/01= /2005|||||| D|2006|121201300030001012|08|1|1014|1365|xxxxxxxx|1|2|11|10/01/2005|20/01= /2005|||||| D|2006|121201300000001040|08|1|1014|1365|xxxxxxxx|2|3|15|15/01/2005|21/01= /2005|||||| D|2006|121201300000001060|08|1|1014|1365|xxxxxxxx|2|4|16|15/01/2005|21/01= /2005|||||| D|2006|320011300800001011|08|3200113008|1014|1365|xxxxxxxx|3|5|12|12/01/2= 005|21/01/2005|||||| D|2006|320011300800001020|08|3200113008|1014|1365|xxxxxxxx|3|6|13|13/01/2= 005|21/01/2005|||||| &|6|Et ça change tout. Donc il y a une ligne vide entre la ligne avec filename et le paragraphe En plus filename n'est pas au début de la ligne, avant il y a des espaces moi je cherchais ^filename, donc un filename au début de ligne jusqu'à la ligne vide qui fini le paragraphe tu comprends le problème?! je vais voir ce soir, je n'ai pas la possibilité de tester lami20j |
Essaie avec #!/chemin/vers/ton/perl
use strict;use warnings;
open F_LIRE,'D:\Shared\Perl\F0006741.dc'
or die "E/S : $!\n";
open F_ECRIRE,'>> D:\Shared\Perl\resultat.txt'
or die "E/S : $!\n";
while(<F_LIRE>){
print F_ECRIRE if /\s+filename=/.../^---/;
}
close F_LIRE;
close F_ECRIRE;
__END__ lami20j
P.S. le script s'exécute sans erreurs mais le fichiers resultat.txt est vide? Le fait que le fichier resultat.txt a été créé veut dire que le script fonctionne. Mais à cause de format que tu as donné au début il ne trouve rien, donc il n'écrit rien dans le fichier que le script a créé |
ca marche lami20j;merci beaucoup;
|
Re,
#!/chemin/vers/ton/perl
use strict;use warnings;
open F_ECRIRE,'>> D:\Shared\Perl\resultat.txt'
or die "E/S : $!\n";
while(<>){
print F_ECRIRE if /\s+filename=/.../^---/;
}
close F_ECRIRE;
__END__
2/ comment enlever les retour chariot dans le fichier resultat.txt* essaie ça (je n'ai pas testé) #!/chemin/vers/ton/perl
use strict;use warnings;
open F_ECRIRE,'>> D:\Shared\Perl\resultat.txt'
or die "E/S : $!\n";
while(<>){
s/(\d=)\r?\n?/$1/;
print F_ECRIRE if /\s+filename=/.../^---/;
}
close F_ECRIRE;
__END__ lami20j |
Re
#!/bin/sh /usr/bin/perl extract.pl F0006741.dc mais je veux l'integré dans un script shell dans un environnement Unix Dans ce cas il faut faire attention pour les caractère nouvelle ligne \n et retour chariot \r. Il faut tester le script pour voir ce que ça donne. Tu risques d'avoir des erreurs. lami20j |
Merci encore une fois :-)
|
je voyais ce resultat comme un reve,
|
Bonjour,
|
Répondre à lami20j
|
Répondre à lami20j
|

