Modifier un fichier texte en remplacant une chaine par une autre [Résolu]

ajfanfan 8 Messages postés lundi 4 avril 2005Date d'inscription 6 avril 2005 Dernière intervention - 4 avril 2005 à 13:50 - Dernière réponse : Mr_Obywan 1 Messages postés vendredi 23 septembre 2005Date d'inscription 23 septembre 2005 Dernière intervention
- 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
Afficher la suite 

10 réponses

Répondre au sujet
cs_Sobieski 54 Messages postés mardi 22 mars 2005Date d'inscription 13 mars 2007 Dernière intervention - 4 avril 2005 à 15:44
+3
Utile
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)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Sobieski
kirua12 1155 Messages postés samedi 17 janvier 2004Date d'inscription 29 avril 2011 Dernière intervention - 4 avril 2005 à 16:19
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de kirua12
cs_Sobieski 54 Messages postés mardi 22 mars 2005Date d'inscription 13 mars 2007 Dernière intervention - 4 avril 2005 à 14:11
0
Utile
Tu dois l'ouvrir en lecture avec un FileReader et en écriture avec FileWriter. A ma connaissance il n'existe pas de FileRWer.
Commenter la réponse de cs_Sobieski
ajfanfan 8 Messages postés lundi 4 avril 2005Date d'inscription 6 avril 2005 Dernière intervention - 4 avril 2005 à 15:03
0
Utile
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.
Commenter la réponse de ajfanfan
cs_Sobieski 54 Messages postés mardi 22 mars 2005Date d'inscription 13 mars 2007 Dernière intervention - 4 avril 2005 à 15:14
0
Utile
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
Commenter la réponse de cs_Sobieski
ajfanfan 8 Messages postés lundi 4 avril 2005Date d'inscription 6 avril 2005 Dernière intervention - 4 avril 2005 à 15:25
0
Utile
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+
Commenter la réponse de ajfanfan
cs_Sobieski 54 Messages postés mardi 22 mars 2005Date d'inscription 13 mars 2007 Dernière intervention - 4 avril 2005 à 15:33
0
Utile
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.
Commenter la réponse de cs_Sobieski
ajfanfan 8 Messages postés lundi 4 avril 2005Date d'inscription 6 avril 2005 Dernière intervention - 4 avril 2005 à 16:21
0
Utile
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....
Commenter la réponse de ajfanfan
ajfanfan 8 Messages postés lundi 4 avril 2005Date d'inscription 6 avril 2005 Dernière intervention - 4 avril 2005 à 16:23
0
Utile
J'ai poster en même temps. J'éssaierai avec RandomAccessFile pour apprendre.

Merci.
Commenter la réponse de ajfanfan
Mr_Obywan 1 Messages postés vendredi 23 septembre 2005Date d'inscription 23 septembre 2005 Dernière intervention - 23 sept. 2005 à 18:38
0
Utile
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?
Commenter la réponse de Mr_Obywan

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.