Rechercher : dans
Par :

Modifier un fichier avec un script perl

Dernière réponse le 5 jan 2009 à 22:36:05 eccomi, le 5 jan 2009 à 15:26:32 
 Signaler ce message aux modérateurs

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.
Configuration: Mac OS X
Firefox 3.0.5

Meilleures réponses pour « Modifier un fichier avec un script perl » dans :
Modifier son fichier Hosts VoirPOURQUOI modifier le fichier Hosts ? COMMENT modifier le fichier Hosts ? Où se trouve le fichier Hosts original ? Que contient-il ? Méthode de modification Restaurer le fichier Hosts à son état d'origine POURQUOI modifier le fichier...
Fichier Hosts ou Lhosts : modification impossible VoirMessages d'erreur : Ces messages d'erreurs apparaissent lorsque vous essayez de modifier le fichier Hosts (ou Lmhosts) dans Microsoft Windows Vista depuis un compte administrateur : Accès à C:\Windows\System32\drivers\etc\ hosts refuséou...
Sed - Supprimer une ou plusieurs lignes d'un fichier VoirSupprimer une (ou plusieurs) ligne(s) d'un fichier Syntaxe sed '{[/]||[/]}d' sed '{[/][,][/]d' /.../ = délimiteurs n = le numéro de ligne chaîne = la chaîne contenue dans la...
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...
Perl - Caractéristiques du langage VoirFichier source, et interprétation Le fichier source d'un programme écrit en Perl est un simple fichier texte dont l'extension est par convention .pl. Ce fichier source doit être un fichier texte non formatté, c'est-à-dire un fichier texte dans sa...

1

loupius, le 5 jan 2009 à 16:25:28

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.enstimac.fr/DocFr/perlfaq5.html#comment créer un fichier temporaire

Répondre à loupius

3

eccomi, le 5 jan 2009 à 18:31:32

La création d'un fichier temporaire, c'est ce que je voudrais justement éviter. Merci tout de même pour la réponse.

Répondre à eccomi

2

davlar, le 5 jan 2009 à 18:23:20

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

Répondre à davlar

4

eccomi, le 5 jan 2009 à 18:35:43

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.

Répondre à eccomi

5

loupius, le 5 jan 2009 à 18:59:42

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.

Répondre à loupius

6

davlar, le 5 jan 2009 à 20:36:57

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

Répondre à davlar

7

eccomi, le 5 jan 2009 à 22:07:39

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.

Répondre à eccomi

8

 loupius, le 5 jan 2009 à 22:36:05

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.

Répondre à loupius