Téléchargement
illégal
Posez votre question Signaler

[PERL] Ecrire dans un fichier [Résolu]

kayari 2Messages postés 24 octobre 2004Date d'inscription - Dernière réponse le 7 juil. 2011 à 17:53
Bonjour tout le monde,
je programme en perl et j'ai besoin de modifier des paramètres dans un fichier automatiquement. voici un extrait du fichier :
n 108
m 56
s 2
t 4
a 1 2 1
j'ai besoin d'accéder aux lignes 3 et 4 et de changer 2 et 4 par d'autres valeurs (se répète en boucle). Je n'ai pas su changer des valeurs à l'intérieur du fichier.
Est ce que quelqu'un pourrait me donner une indication.
Merci d'avance
Lire la suite 

[PERL] Ecrire dans un fichier »

49 réponses
Réponse
+6
moins plus
Bonsoir,

#!/usr/bin/perl -w
use strict;
# D'abord charger le fichier:
open(FILE, "$fichier") || die "Erreur E/S:$!\n";
my @contenu = <FILE>;
close(FILE);
# Ensuite, changer à la ligne 3 et 4:
$contenu[2] =~ s/2/5/;   # par exemple
$contenu[3] =~ s/4/6/;   # par exemple
# Enfin on sauvegarde le fichier:
open(FILE, ">$fichier") || die "Erreur E/S:$!\n";
foreach my $ligne (@contenu) {
    chomp $ligne;
    print FILE "$ligne\n";
}


OK?
kayari - 16 mai 2005 à 23:42
En fait c'est avec cette méthode que j'ai fini par faire. Mais le problème est que le fichier est volumineux et cette procédure est appelée plusieurs fois dans une boucle donc je voulais trouver une méthode plus rapide.
remarque : à chaque fois je vais modifier les lignes 3 et 4 seulement et j'ai des dizaines de lignes dans le fichier
Merci pour ton indication
cyrille - 7 juil. 2011 à 17:53
ça marche, mais il manque un "close(FILE)" à la fin du code
Ajouter un commentaire
Réponse
+1
moins plus
Bonjour,

Premièrement, je voudrais aussi écrire dans un fichier, mais je ne coonias rien du perl.

mon fichier est normalisé comme cela:
05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl

je souhaite pouvoir ajouter en début de chaque ligne une date au format 00/00/0000 puis un carcatere "espace" et un "=" pour séparer. L'idéal serait d'avoir une fenetre d'affichage qui demande "veuillez saisir la date a rajouter au fichier :" et ensuite ajouter cette date au début de chaque ligne.

les lignes du fichier doient devenir comme cela par exemple
02/03/2007 = 05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl

Ensuite, j'aimerais, toujours en perl, concatener plusieurs fichers. C'est a dire, j'ai plusieurs fichiers .txt de date différentes (auxquels j'ai pu ajouter la date auparavant) et je voudrais n'en avoir plus qu'un seul qui contient l'ensemble du contenu des autres fichiers.

En ésperant avoir été clair ...
Merci par avance
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

petite question.
Ton fichier contient plusieurs lignes
s2
t4

C'est ça que tu veut modifier?
Si tu me donnes le fichier (sauf s'il n'est pas confidentiel) je pourrais t'aider.

A+
Ajouter un commentaire
Réponse
+0
moins plus
Salut kayari,

Il y a une chose que je ne comprend pas.

" à chaque fois je vais modifier les lignes 3 et 4 seulement et j'ai des dizaines de lignes dans le fichier "

Ton fichier volumineux quel que soit sa taille ne contient qu'une seule ligne 3 et une seule ligne 4.

Donc c'est quoi ton souci en fait?
Ajouter un commentaire
Réponse
+0
moins plus
Si toutes les lignes que tu veut modifier sont

s2
t4

alors tu n'as qu'à taper dans la konsole

perl -p -i -e 's#(?<=s)2$#5#g' ton_fichier
perl -p -i -e 's#(?<=t)4$#6#g' ton_fichier
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

je n'ai pas testé

tu peux le tester sans peur, rien ne sera modifié dans tes fichiers d'origine
#!/usr/bin/perl
use warnings;use strict;

print "Veuillez saisir la date à rajouter au fichier (format jj/mm/aaaa, ex : 12/03/2007) : ";

chomp(my $date = <STDIN>);


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

chomp(my @fic = glob("*.txt"));

foreach my $e(@fic){
  open F_LIRE,"$e" or warn "E/S : $!\n";
  while(<F_LIRE>){
    print F_ECRIRE "$date = $_";
  }
} 
__END__


ou en ligne de commande(il faut juste mettre la date que tu veux
cat *.txt | perl -ne 's#(.*)#12/03/2007 = $1#;print' > resultat.txt
Danbs les 2 cas le resultat on l'obtient dans le fichier resultat.txt.
Donc avant de la 2ème variante il faut vider resultat.txt
Ajouter un commentaire
Réponse
+0
moins plus
Le fichier resultat.txt est vide après execution de la commande ...

Je pense que cela ne fonctionne pas correctement, la compilation est ok, il y a bien création du fichier resultat.txt mais aucun contenu a l'interieur.

Est ce normal ?

en attendant, je vais essayer avec mes fichiers.
Ajouter un commentaire
Réponse
+0
moins plus
J'ai parler un peu trop vite ...
Je ne comprends pas assez bien la structure du code pourpouvoir tester avec mes fichiers, j'aurai besoin de qq commentaires :

print "Veuillez saisir la date à rajouter au fichier (format jj/mm/aaaa, ex : 12/03/2007) : "; #affiche la demande de saisie

chomp(my $date = <STDIN>); # enregistre la saisie dans la variable date ?


open F_ECRIRE,">>resultat.txt" or die "E/S : $!\n"; # crée le fichier resultat en mode ecriture ??

chomp(my @fic = glob("*.txt")); # ??

foreach my $e(@fic){
open F_LIRE,"$e" or warn "E/S : $!\n";
while(<F_LIRE>){
print F_ECRIRE "$date = $_";
}
}
__END__

je suis largué sur la fin, avec la boucle foreach

Help please
Ajouter un commentaire
Réponse
+0
moins plus
La ligne de commande fonctionne
jack@pc-jack:~$ ls *.txt
f1.txt  f2.txt  f3.txt
jack@pc-jack:~$ cat *.txt
05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
jack@pc-jack:~$ cat *.txt | perl -ne 's#^#12/03/2007 = #;print' > resultat.txt
jack@pc-jack:~$ cat resultat.txt
12/03/2007 = 05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
12/03/2007 = 05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
12/03/2007 = 05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
12/03/2007 = 05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
12/03/2007 = 05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
12/03/2007 = 05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
12/03/2007 = 05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
12/03/2007 = 05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
12/03/2007 = 05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl

Ajouter un commentaire
Réponse
+0
moins plus
Le script aussi
jack@pc-jack:~$ ls *.txt
f1.txt  f2.txt  f3.txt
jack@pc-jack:~$ cat f1.txt
05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
jack@pc-jack:~$ cat f2.txt
05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
jack@pc-jack:~$ cat f3.txt
05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
jack@pc-jack:~$ cat fic.pl
#!/usr/bin/perl
use warnings;use strict;

print "Veuillez saisir la date à rajouter au fichier (format jj/mm/aaaa, ex : 12/03/2007) : ";

chomp(my $date = <STDIN>);


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

chomp(my @fic = glob("*.txt"));

foreach my $e(@fic){
  open F_LIRE,"$e" or warn "E/S : $!\n";
    while(<F_LIRE>){
        print F_ECRIRE "$date = $_";
    }
}
__END__


jack@pc-jack:~$ ls resultat.txt
ls: resultat.txt: Aucun fichier ou répertoire de ce type
jack@pc-jack:~$ perl fic.pl
Veuillez saisir la date à rajouter au fichier (format jj/mm/aaaa, ex : 12/03/2007) : 12/03/2007
jack@pc-jack:~$ cat resultat.txt
12/03/2007 = 05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
12/03/2007 = 05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
12/03/2007 = 05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
12/03/2007 = 05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
12/03/2007 = 05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
12/03/2007 = 05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
12/03/2007 = 05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
12/03/2007 = 05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
12/03/2007 = 05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl

Ajouter un commentaire
Réponse
+0
moins plus
Bon alors, tout compte fait, ça marche nickel merci

Si j'ai bien compris, ça marche avec un fichier *.txt dans le meme reprtoire que le code.pl...vrai ? mais si j'ai plusieurs fichiers dans le repertoire et je souhaite choisir le fichier a traiter ??

Je souhaiterais améliorer cela, je voudrais pouvoir effectuer l'ajout de date sur plusieurs fichiers txt avec des date différentes, on obtient plusieurs fichiers résultat.txt pour ensuite, concatener l'ensemble des resultat.txt en un seul fichier resultatfinal.txt !


Comment faire?
Merci
Ajouter un commentaire
Réponse
+0
moins plus
Je suis au boulot.
J'ai vu que tu as posté le msg sur developpez.com :-))

Je vais regarder ce soir.
Ajouter un commentaire
Réponse
+0
moins plus
OK, c'est cool

moi aussi, je suis au boulot. c'est d'ailleurs pour ça que je fais ça.

Pour résumé, j'ai presque compris mais il me reste à, dans l'ordre :

- pouvoir choisir une date et un fichier, obtenir un fichier résultat
ex: le fichier statXiti_061206 à la date du 06/12/2006, ce qui donne en sortie le fichier resultat_06122006.txt
et ce, pour plusieurs fichiers dans le meme repertoire avec des dates différentes (staXiti_061207.txt, staXiti_061208.txt, staXiti_061209.txt...)

- etre capable de concatener, si possible de façon automatique, les fichiers résultat_XDATEX.txt en un seul fichier resultatfinal.txt

Merci pour ton aide,
Bon courage
Ajouter un commentaire
Réponse
+0
moins plus
Avant l'exécution de script

lami20j@debian:~/trash/chabrrr$ ls -1
staXiti_061207.txt
staXiti_061208.txt
staXiti_061209.txt
xiti_stat.pl
lami20j@debian:~/trash/chabrrr$ cat staXiti_061207.txt
05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
lami20j@debian:~/trash/chabrrr$ cat staXiti_061208.txt
05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
lami20j@debian:~/trash/chabrrr$ cat staXiti_061209.txt
05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl

Le script
lami20j@debian:~/trash/chabrrr$ cat xiti_stat.pl
#!/usr/bin/perl
use warnings;use strict;
my @fic_stat = </home/lami20j/trash/chabrrr/staXiti*>;

foreach my $fichier (@fic_stat){
  $fichier =~ /\/staXiti_(\d{4})(\d\d)\.txt/;
  my $date = "${1}20$2";
  my $fic = "resultat_" . "$date.txt";

  open F_ECRIRE,">>$fic" or warn "E/S : $!\n";
  open F_LIRE,"$fichier" or warn "E/S : $!\n";

  while(<F_LIRE>){
    s/^/$date = /;
    print F_ECRIRE $_;
  }
}
#*********** FIN TRAITEMENT **********#
#
# concateantion dans resultatfinal.txt
open F_ECRIRE,">>resultatfinal.txt" or die "E/S : $!\n";
my @fic_res = </home/lami20j/trash/chabrrr/resultat_*.txt>;

foreach my $e(@fic_res){
  open F_LIRE,"$e" or warn "E/S : $!\n";
  while(<F_LIRE>){
    print F_ECRIRE;
  }
}
__END__

Exécution de script
lami20j@debian:~/trash/chabrrr$ perl xiti_stat.pl

Le résultat
lami20j@debian:~/trash/chabrrr$ ls -1
resultat_06122007.txt
resultat_06122008.txt
resultat_06122009.txt
resultatfinal.txt
staXiti_061207.txt
staXiti_061208.txt
staXiti_061209.txt
xiti_stat.pl
lami20j@debian:~/trash/chabrrr$ cat resultat_06122007.txt
06122007 = 05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
06122007 = 05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
06122007 = 05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
lami20j@debian:~/trash/chabrrr$ cat resultat_06122008.txt
06122008 = 05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
06122008 = 05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
06122008 = 05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
lami20j@debian:~/trash/chabrrr$ cat resultat_06122009.txt
06122009 = 05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
06122009 = 05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
06122009 = 05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
lami20j@debian:~/trash/chabrrr$ cat resultatfinal.txt
06122007 = 05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
06122007 = 05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
06122007 = 05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
06122008 = 05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
06122008 = 05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
06122008 = 05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
06122009 = 05:57:42 10.100.62.52 /hit.xiti s=241243&s2=1&p=PNC&hl
06122009 = 05:57:43 10.100.62.52 /hit.xiti s=241243&s2=1&p=GSM_reconnu&hl
06122009 = 05:57:49 10.100.62.52 /hit.xiti s=241243&s2=1&p=transfere&hl
lami20j@debian:~/trash/chabrrr$

chabRRR- 13 mars 2007 à 11:34
Bonjour,

je te remercie pour ton aide

Mais j'ai encore deux petites questions :

1. je n'arrive pas a faire fonctionner le script correctement avec mes noms de repertoire. Jai essayé comme cela mais ça ne convient pas ...

le code

#!C:/Perl/bin/perl.exe


my @fic_stat = </d:\Documents and SettingsM149067\Bureau\Simon\DB\Perl\StatXiti\staXiti*>;

foreach my $fichier (@fic_stat){
$fichier =~ /\/staXiti_(\d{4})(\d\d)\.txt/;
my $date = "${1}20$2";
my $fic = "resultat_" . "$date.txt";

open F_ECRIRE,">>$fic" or warn "E/S : $!\n";
open F_LIRE,"$fichier" or warn "E/S : $!\n";

while(<F_LIRE>){
s/^/$date = /;
print F_ECRIRE $_;
}
}
#*********** FIN TRAITEMENT **********#
#
# concateantion dans resultatfinal.txt
open F_ECRIRE,">>resultatfinal.txt" or die "E/S : $!\n";
my @fic_res = </d:\Documents and Settings\M149067\Bureau\Simon\DB\Perl\StatXiti\resultat_*.txt>;

foreach my $e(@fic_res){
open F_LIRE,"$e" or warn "E/S : $!\n";
while(<F_LIRE>){
print F_ECRIRE;
}
}
__END__

Que dois je faire pour indique mon nom de repertoire ?

2. je travaille sous windows et pas unix. je crois que la commande cat devient copy sous win, je vais aller voir le fonctionnement de cette commande. Si tu as des informations là dessus aussi, n'hesites pas a m'en faire part;

Merci encore
Ajouter un commentaire
Réponse
+0
moins plus
Je vais voir ça

Au lieu de cat utilise type sous win
Ajouter un commentaire
Réponse
+0
moins plus
Voici le code qui fonctionne sous win
use warnings;use strict;

my @fic_stat = <"D:/Documents and Settings/Administrateur/Bureau/staXiti*">;


foreach my $fichier (@fic_stat){
  $fichier =~ /\/staXiti_(\d{4})(\d\d)\.txt/;
  my $date = "${1}20$2";

  my $fic = "resultat_" . "$date.txt";

  open F_ECRIRE,">>$fic" or warn "E/S : $!\n";
  open F_LIRE,"$fichier" or warn "E/S : $!\n";

  while(<F_LIRE>){
    s/^/$date = /;
    print F_ECRIRE;
  }
}
#*********** FIN TRAITEMENT **********#
#
# concateantion dans resultatfinal.txt
open F_ECRIRE,">>resultatfinal.txt" or die "E/S : $!\n";


my @fic_res = <"D:/Documents\ and\ Settings/Administrateur/Bureau/resultat_*.txt">;

foreach my $e(@fic_res){
  open F_LIRE,"$e" or warn "E/S : ICI $!\n";
  while(<F_LIRE>){
    print F_ECRIRE;
  }
  print F_ECRIRE "\n";
}
__END__
Ajouter un commentaire
Réponse
+0
moins plus
Voilà un aperçu ici http://cjoint.com/?dnmYCaei6z
Ajouter un commentaire
Réponse
+0
moins plus
Mince !! le fichier résultat est toujours vide ?!?!
je comprends pas, j'ai essayé de changer le nom du repertoire, puis de mettre tout mes fichiers sur le bureau, mais ...ça ne va toujours pas.

je suis désolé de te demander encore un coup de main, mais d'ou peux venir le problème ?
Ajouter un commentaire
Réponse
+0
moins plus
Il faut que tu me montre tout ce que tu fait.
Avec des imprimés écran.

Chez moi ça fonctionne sans problème.
Ajouter un commentaire
Réponse
+0
moins plus
les fichiers et le script sont sur mon bureau
http://cjoint.com/?dnoa7cQVFD

le script est edité comme cela, et je pense que le problème est dans le script...
http://cjoint.com/?dnohVdyajX

les fichiers ont cette structure
http://cjoint.com/?dnodObwzzw

la console execute le script
http://cjoint.com/?dnoepZOjT3

et voila le resultat qui est vide ???
http://cjoint.com/?dnogcMWQvN

Qu'en penses tu ?
Ajouter un commentaire
Ce document intitulé « [PERL] Ecrire dans un fichier » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?
[PERL] Ecrire dans un fichier - page 2