Modifier un fichier texte en remplacant une chaine par une autre

Résolu
ajfanfan Messages postés 8 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 6 avril 2005 - 4 avril 2005 à 13:50
Mr_Obywan Messages postés 1 Date d'inscription vendredi 23 septembre 2005 Statut Membre Dernière intervention 23 septembre 2005 - 23 sept. 2005 à 18:38
Bonjour,

je souhaite ouvrir un fichier texte, rechercher les occurences d'une
chaine et les remplacer par une autre, puis sauvegarder le fichier
texte avec les modifications.

si j'ai bien compris (ce qui m'étonnerait). la classe java.io permet de
créer des flux d'entrée et de sortie sur un fichier, la seule idée qui
me vient, c'est d'ouvrir le fichier texte, le lire, modifier le
résultat de la lecture l'écrire dans un autre fichier, et pour finir
écraser le fichier source par le nouveau.

Cela ne me parait pas très évolué. y'a t il une classe permettant
d'ouvrir le fichier en Lecture/Ecriture pour travailler directement
dessus.

D'avance merci

10 réponses

cs_Sobieski Messages postés 54 Date d'inscription mardi 22 mars 2005 Statut Membre Dernière intervention 13 mars 2007
4 avril 2005 à 15:44
import java.io.*;
class CatFichier {
public static void main (String[] arg) throws IOException{
if (arg.length == 0){
System.err.println("Erreur paramètres");
System.exit(1);
}
File fichiersource = new File(arg[0]);
File fichiercible = new File([dumbpath]);
fichiercible.createNewFile();
BufferedReader fichier = new BufferedReader(new FileReader(fichiersource));
BufferedWriter fichierW = new BufferedWriter(new FileWriter(fichiercible));
String str;
str = fichier.readLine( );

while (str != null){
System.out.println(str);
str=str.replaceAll("SHOW_MENU","--SHOW_MENU");
str=str.replaceAll("Show_Menu","--SHOW_MENU");
str=str.replaceAll("Show_menu","--SHOW_MENU");
str=str.replaceAll("show_menu","--SHOW_MENU");
fichierW.write(str);
fichierW.flush();
str = fichier.readLine( );
}
fichierW.close();
fichiersource.delete();
fichiercible.renameTo(fichiersource);
}
}

A priori c'est tres moche et pas trop ce que tu voulais faire mais ca doit fonctionner (moyennent un petit débug quand même)
3
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 8
4 avril 2005 à 16:19
Salut,

tu ne peux pas ouvrir un fichier en lecture et en écriture en même temps en utilisant les FileReader et FileWriter. Il n'y a qu'uine classe qui peut faire ça : java.io.RandomAccesFile.
L'utilisation est un peu complexe et au final revient au même que lire un fichier, écrire dans un autre et le renommer puisqu'il qu'avec le RandomAccesFile il faut réecrire chaque ligne.
Donc ce que propose Sobieski est tout à fait correct et il n'y a pas vraiment de solution élégante.
3
cs_Sobieski Messages postés 54 Date d'inscription mardi 22 mars 2005 Statut Membre Dernière intervention 13 mars 2007
4 avril 2005 à 14:11
Tu dois l'ouvrir en lecture avec un FileReader et en écriture avec FileWriter. A ma connaissance il n'existe pas de FileRWer.
0
ajfanfan Messages postés 8 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 6 avril 2005
4 avril 2005 à 15:03
Ok, je comprend bien ce que tu veux me dire,

mais il me reste un problème.

j'ai écrit quelque chose comme ca :

import java.io.*;

class CatFichier {

public static void main (String[] arg) throws IOException{

if (arg.length == 0){

System.err.println("Erreur paramètres");

System.exit(1);

}

BufferedReader fichier
= new BufferedReader(new FileReader(arg[0]));

BufferedWriter fichierW = new BufferedWriter(new FileWriter(arg[0]));

String str;

str = fichier.readLine( );

while (str != null){

System.out.println(str);

str=str.replaceAll("SHOW_MENU","--SHOW_MENU");

str=str.replaceAll("Show_Menu","--SHOW_MENU");

str=str.replaceAll("Show_menu","--SHOW_MENU");

str=str.replaceAll("show_menu","--SHOW_MENU");

fichierW.write(str);

str = fichier.readLine( );

}

}

}



cela me crée un fichier de taille nulle, il doit me manquer quelque chose entre entrée et sortie.

Ai je le droit de réécrire sur le même fichier?

Merci de ton aide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Sobieski Messages postés 54 Date d'inscription mardi 22 mars 2005 Statut Membre Dernière intervention 13 mars 2007
4 avril 2005 à 15:14
La tu tentes de travailler sur le même fichier. Qu'entends-tu par "cela me crée un fichier de taille nulle" ? ton fichier de base est écrasée ou ça en créé un nouveau ?
Apres un write je te conseille un fichierW.flush() aussi, histoire que ca prenne en compte la commande write
0
ajfanfan Messages postés 8 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 6 avril 2005
4 avril 2005 à 15:25
Faut il que je travaille sur un autre fichier et que je le recopie ensuite?

c'est pas super pratique.



Pour répondre a ta question, ca écrase le fichier de base. je continue
de tester et te recontacte si besoin (dans environ 2 minutes ;-)



merci

A+
0
cs_Sobieski Messages postés 54 Date d'inscription mardi 22 mars 2005 Statut Membre Dernière intervention 13 mars 2007
4 avril 2005 à 15:33
La feinte c'est que si tu flush() pas et qu'a la fin tu close() pas ca va pas faire trop ce que tu veux en fait.
Donc au final ca devrait donner ca :

while (str != null){
System.out.println(str);
str=str.replaceAll("SHOW_MENU","--SHOW_MENU");
str=str.replaceAll("Show_Menu","--SHOW_MENU");
str=str.replaceAll("Show_menu","--SHOW_MENU");
str=str.replaceAll("show_menu","--SHOW_MENU");
fichierW.write(str);
fichierW.flush();
str = fichier.readLine( );
}

fichierW.close();

Le problème la c'est que ta ligne tu la places pas dans ton fichier (je veux dire "telle ligne à tel endroit"), je vais jeter un oeil pour tenter de trouver une feinte.
0
ajfanfan Messages postés 8 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 6 avril 2005
4 avril 2005 à 16:21
Ok, ca fonctionne, il faut juste fermer avant le delete le flux d'entree (fichier.close).

C'est exactement ce que je voulais faire, mais je dois avouer que ce
n'était pas comme ça que je voulais faire. l'histoire des flux d'entrée
sortie m'apparait comme restrictif, puiqu'il faut une variable
temporaire du type fichier pour fonctionner.

Je suis ouvert à toutes proposition pour embellir ce code, même si dans le fond, ca fonctionne et ca me suffit.

Merci Sobieski, A+ pour une nouvelle danse....
0
ajfanfan Messages postés 8 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 6 avril 2005
4 avril 2005 à 16:23
J'ai poster en même temps. J'éssaierai avec RandomAccessFile pour apprendre.

Merci.
0
Mr_Obywan Messages postés 1 Date d'inscription vendredi 23 septembre 2005 Statut Membre Dernière intervention 23 septembre 2005
23 sept. 2005 à 18:38
Oui c'est bien beau cette méthode, mais pour les fichiers qui comporte
des retours à la ligne, et bien après passage dans cette méthode, les
retours à la ligne disparaissent et le contenu des fichiers est écrit
tout à la suite... Certes avec les transformations demandées, mais tout
en une seule ligne... Comment corriger ça?
0
Rejoignez-nous