salut tout le monde,
dans un fichier texte, j'aimerai savoir comment rechercher une chaine de caracteres specifique puis la remplacer par une autre.
merci
Discussion :
salut tout le monde,
dans un fichier texte, j'aimerai savoir comment rechercher une chaine de caracteres specifique puis la remplacer par une autre.
merci
en récupérant ton fichier puis en utilisant replaceAll de String qui te permet de remplacer des mots par des autres (il y a un exemple dans la FAQ)
je crois que tu est obligé de parcourir le fichier pour remplir une variable (un stringBuffer) et de faire un replaceAll dessus.
mais bon il y a peut etre plus propre/efficace ...
[EDIT] ha pas assez rapide ...![]()
à mon avis, le plus rapide pourrait être :
- d'ouvrir un flux de fichier (on va l'appeler 'r') depuis le fichier que tu veux lire
- d'ouvrir un flux de fichier (on va l'appeler 'w') vers 1 nouveau fichier (tester si existant -> effacer puis recréer)
de déclarer 1 String 's' qui prend la première valeur lue de r
et enfin :
tant que s non null {
écrire s.replace("chaine à remplacer", "chaine à inscrire") dans w
lire s dans r
}
Voilà .. t'as l'algo
histoire d'avoir plusieurs points de vue, moi j'aurais plutot vu un truc style :
avec les exceptions qui vont bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 BufferedReader in=new BufferedReader(new FileReader("source")); StringBuffer sb = new StringBuffer(); while((ligne=in.readLine())!=null){ sb.append(ligne) } String clean = sb.toString().replaceAll("Recherché","Remplacé par"); in.reset(); // à voir si c'est suffisant in.write(clean); in.close();
Apres ça dépend de ce que tu veux remplacer. Si c'est juste des caractères, la solution de neptus est bonne. Apres si c'est des phrases (et donc sur plusieurs lignes) mieux vaut travailler sur le texte dans sa globalité.
Apres, mon idée est surement moins rapide que celle de Neptus. Peut etre un mis des 2 te comblerait ...
écrire dans 1 reader ??
original ... mais faux il me semble.
oui effectivement, j'ai pas trop réfléchi ...![]()
mais bon ... c'est pas vraiment important pour la compréhension de l'algo je pense
ATTENTION ! NE PAS COPIER/COLLER ET METTRE EN PRODUCTION![]()
Et voila !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 public static boolean readReplace(String fileName, String oldPattern, String replPattern, int lineNumber) { String line; StringBuffer sb = new StringBuffer(); int nbLinesRead = 0; try { FileInputStream fis = new FileInputStream(fileName); BufferedReader reader = new BufferedReader(new InputStreamReader( fis)); while ((line = reader.readLine()) != null) { nbLinesRead++; line = line.toLowerCase(); if (nbLinesRead == lineNumber) { line = line.replaceFirst(oldPattern.toLowerCase(), replPattern); } sb.append(line + "\n"); } reader.close(); BufferedWriter out = new BufferedWriter(new FileWriter(fileName)); out.write(sb.toString()); out.close(); } catch (Exception e) { return false; } return true; }![]()
c'est une autre façon de voir le problème :
ton code impose deux contraintes importantes :
1 - il faut connaître la ligne (n°) à modifier (si il n'y en a qu'une
2 - on considère que la chaine à remplacer dans le fichier ne contient pas de majuscule !!!!
un peu tordu ton code .. enfin tout dépend du besoin ....
duorade, si tu pouvais éclaircir le terme "rechercher une chaine de caracteres specifique" : tu entend par là une seule chaîne dans le fichier (présente à une seule ligne) ou alors toutes les instances de la chaîne recherchée ?
1 dernier truc : on est pas forcément là pour cracher du code : si il cherche par lui-même et qu'il trouve, la prochaine fois il s'en souviendra![]()
(et ça nous permettra de ne pas à avoir à lui répéter)
J'ai donné ce code comme je l'utilise, rien n'empêche de le modifier... Si t'as pas besoin de connaître le numéro de ligne, tu le vires, si tu ne veux pas utiliser la méthode toLowerCase, tu la vires. Le problème c'est qu'il faudra être plus précis sur l'input que tu passeras en paramètre...
J'avais cette méthode sous le coude, je m'en suis inspiré d'une trouvé sur le net, donc au final en cherchant bien il aurait bien finit par la trouver...![]()
ben il l'a cherchée ici et il l'a finalement trouvée![]()
Partager