Modifier un fichier avec un script perl

Fermé
eccomi Messages postés 13 Date d'inscription dimanche 9 décembre 2007 Statut Membre Dernière intervention 5 janvier 2009 - 5 janv. 2009 à 15:26
 loupius - 5 janv. 2009 à 22:36
Bonjour à tous et Bonne année,

J'ai question assez bête, je n'arrive pas à modifier un fichier texte avec un script perl. J'aimerais le modifier directement sans en créer un autre pour récupérer les modifications. Comment dois-je ouvrir mon fichier?

Voilà le script que j'ai fait, mais il ne modifie pas mon fichier en entrée. En sortie standard, je vois bien les modifications.



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

open (LIRE,"+<texte.txt")
    or die "E/S : $!\n";


while(<LIRE>){

       $_ =~ s/è/è/g; 
       $_ =~ s/é/é/g; 
        
      print "$_\n\n";

}




Le texte est le suivant:

Archives — Juillet 2005Mondialisation, acte IILe grand tournant de Washington En recevant, le 20 juin, MM. Jean-Claude Juncker et José Manuel Barroso, délégués d’une Union européenne en crise, M. George W. Bush a affirmé : « Les Etats-Unis continuent d’apporter leur soutien à une Union européenne solide comme partenaire. » Par-delà les formules diplomatiques, l’administration américaine se débat dans ses contradictions, car son unilatéralisme – Ã©conomique, commercial et militaire â€“ se heurte à la réalité multilatérale de la planète. La santé économique de la première puissance dépend largement de l’épargne mondiale, mais les politiques de Washington, inspirées par sa suprématie militaire, contredisent le sacro-saint principe du libre-échange officiellement défendu.

Merci.
A voir également:

4 réponses

Le plus simple, et qui marche à tous les coups, est de passer par un fichier temporaire.
-Création d'un fichier temporaire,
- Lecture dans le fichier ligne par ligne,
- Modification de la ligne,
- Ecriture dans le fichier temporaire,
- Suppression du fichier,
- Renommer le temporaire en nom du fichier.

La difficulté est le nom du fichier temporaire qui ne doit pas exister.
Il existe plusieurs méthodes:
-> http://perl.mines-albi.fr/DocFr/perlfaq5.html#comment créer un fichier temporaire
0
eccomi Messages postés 13 Date d'inscription dimanche 9 décembre 2007 Statut Membre Dernière intervention 5 janvier 2009
5 janv. 2009 à 18:31
La création d'un fichier temporaire, c'est ce que je voudrais justement éviter. Merci tout de même pour la réponse.
0
davlar Messages postés 75 Date d'inscription lundi 26 novembre 2007 Statut Membre Dernière intervention 11 mai 2009 57
5 janv. 2009 à 18:23
Salut ...

Pour ajouter:
open(FIC,">>data.txt")

Les options sont:

Rien = lecture
< = lecture
> = ecriture (ecrasement)
>> = ecriture (ajout)
+> = lecture et ecriture (ecrasement)
+< = lecture et ecriture (ajout)


Ton problème n'est pas sur ton fichier .... tu ne "print" pas dedans voilà tout....

Tu dois faire: print LIRE $_;

A+

Dave
0
eccomi Messages postés 13 Date d'inscription dimanche 9 décembre 2007 Statut Membre Dernière intervention 5 janvier 2009
5 janv. 2009 à 18:35
Salut,

Bien sûr que je ne n'imprime rien dans mon fichier, le "print" que je fais, c'est juste pour voir rapidement dans mon terminal les modifications effectuées.

Si j'imprime dans mon fichier, cela n'écrase pas les anciennes données, mais ça ajoute les données modifiées:

Archives — Juillet 2005Mondialisation, acte IILe grand tournant de Washington En recevant, le 20 juin, MM. Jean-Claude Juncker et José Manuel Barroso, délégués d’une Union européenne en crise, M. George W. Bush a affirmé : « Les Etats-Unis continuent d’apporter leur soutien à  une Union européenne solide comme partenaire. » Par-delà  les formules diplomatiques, l’administration américaine se débat dans ses contradictions, car son unilatéralisme – économique, commercial et militaire – se heurte à  la réalité multilatérale de la planète. La santé économique de la première puissance dépend largement de l’épargne mondiale, mais les politiques de Washington, inspirées par sa suprématie militaire, contredisent le sacro-saint principe du libre-échange officiellement défendu.

Archives — Juillet 2005Mondialisation, acte IILe grand tournant de Washington En recevant, le 20 juin, MM. Jean-Claude Juncker et José Manuel Barroso, délégués d’une Union européenne en crise, M. George W. Bush a affirmé : « Les Etats-Unis continuent d’apporter leur soutien à  une Union européenne solide comme partenaire. » Par-delà  les formules diplomatiques, l’administration américaine se débat dans ses contradictions, car son unilatéralisme – économique, commercial et militaire – se heurte à  la réalité multilatérale de la planète. La santé économique de la première puissance dépend largement de l’épargne mondiale, mais les politiques de Washington, inspirées par sa suprématie militaire, contredisent le sacro-saint principe du libre-échange officiellement défendu.




Merci pour la réponse.
0
loupius > eccomi Messages postés 13 Date d'inscription dimanche 9 décembre 2007 Statut Membre Dernière intervention 5 janvier 2009
5 janv. 2009 à 18:59
Ben oui c'est normal.
Tu ne peux pas supprimer des données dans un fichier; tout ce que tu peux faire c'est écraser des données.
D'une manière générale, il faut gérer 2 pointeurs: un pour la lecture et un pour l'écriture.
Pointeur lecture à 0, on lit une ligne et on conserve le pointeur de lecture.
Pointeur écriture à 0, on écrit et on conserve le pointeur d'écriture.
On remet le pointeur de lecture, on lit une ligne et on conserve le pointeur de lecture,
On remet le pointeur d'écriture, on écrit et on conserve le pointeur de lecture,
Et ainsi de suite jusqu'à la fin en faisant bien attention que l'on écrit moins que l'on ne lit.
Un autre solution, plus simple et si le fichier est raisonnablement court, est de lire fichier dans une chaîne de caractère, de fermer le fichier, de le réouvrir en écriture avec écrasement; évidemment dans ce cas on prend le risque d'un plantage entre l'écrasement et l'écriture.
0
davlar Messages postés 75 Date d'inscription lundi 26 novembre 2007 Statut Membre Dernière intervention 11 mai 2009 57
5 janv. 2009 à 20:36
Hé ... pas bête ..

Comme c'est pas trop gros ... Lis ton fichier et met le tout dans un tableau en prenant soin de couper a tout les lignes.

Relis ton tableau et fait tes modifications. et ensuite réécrit par dessus ton fichier avec le contenue de ton tableau ...

Sinon si tu sais comment imbriquer des commandes tu peu toujours essayer ceci .. (c'est l'équivalent du sed en unix)

perl -pi.bak -e "s/è/è/g" texte.txt
perl -pi.bak -e "s/é/é/g" texte.txt


(le .bak c'est nécessaire si tu es en windows ... sinon tu reçois des erreurs).

David
0
eccomi Messages postés 13 Date d'inscription dimanche 9 décembre 2007 Statut Membre Dernière intervention 5 janvier 2009
5 janv. 2009 à 22:07
Merci à vous deux pour ces pistes.
Je crois que je vais être obligé de créer un fichier temporaire.

Mon problème, c'est que j'ai un dossier de 9500 fichiers, sur lesquels je fais déjà plusieurs traitements avant d'en arriver aux remplacements des caractères diacritiques mal encodés.

Bonne soirée,

eccomi.
0
Je ne vois pas le problème qu'il y ait 2 ou 9500 fichiers.
De toutes façons tu vas traiter les fichiers du répertoire par 'opendir' et 'readdir' et ce sera le PC qui fera le travail!
Bon courage.
0