Trouver et remplacer des mots dans un fichier texte à l'aide de java
Je suis en train d'essayer de trouver et de remplacer certains mots dans un fichier texte à l'aide de java. Mon code fonctionne dans une mesure toutefois la sortie que je reçois est mauvais.
J'ai besoin de remplacer plusieurs mots à partir d'une ligne dans un fichier texte avec la saisie de l'utilisateur, cependant quand je lance mon code à la ligne des copies de lui-même une fois pour chaque mot que je cherche à remplacer.
Par exemple si je veux remplacer les 3 mots suivants:
python ycsb phase db -s -P /home/james/YCSB/workloads/workloada -p
db.url=db://IP:port -p db.database=name
Je me retrouve avec 3 exemplaires de la ligne, chacun avec un autre mot remplacé. Plutôt que de 1 ligne avec tous les 3 de la nécessaire mots remplacés.
Le Code ci-dessous, merci d'avance.
public static void main(String[] args) {
System.out.print("Phase: ");
Scanner sp = new Scanner(System.in);
String p = sp.nextLine();
System.out.print("Database: ");
Scanner sd = new Scanner(System.in);
String d = sd.nextLine();
System.out.print("IP address: ");
Scanner sip = new Scanner(System.in);
int ip = sip.nextInt();
try {
File file = new File("C://users//James//Desktop//newcommand.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = "", oldtext = "";
while((line = reader.readLine()) != null) {
oldtext += line + "\r\n";
}
reader.close();
String phase = oldtext.replaceAll("phase", "" + p);
String database = oldtext.replaceAll("db", "" + d);
String ips = oldtext.replaceAll("IP", "" + ip);
FileWriter writer = new FileWriter("C://users//James//Desktop//newcommand.txt");
writer.write(phase + ips + database);
writer.close();
} catch (IOException e) {
//handle e
}
}
OriginalL'auteur JamesF | 2015-03-15
Vous devez vous connecter pour publier un commentaire.
si je comprends bien la situation, peut-être le problème, c'est que vous remplacez la même chaîne,et le stockage dans les différents var,
essayer ça:
OriginalL'auteur Ricardo Umpierrez
Même si je n'ai pas écrit quoi que ce soit, de sorte que je ne l'ai pas testé, je pense que le problème est clairement vu dans cette partie du code:
Vous êtes à la création de 3 nouvelles chaînes. La première chaîne a remplacé phase, la deuxième a remplacé la db et la troisième a remplacé la propriété intellectuelle. C'est clairement pas ce que vous voulez. Vous devriez faire quelque chose comme ceci:
Edit: Oups, trop tard ^_^
OriginalL'auteur pavlos163
Meilleure version de questions /réponses:
Après la lecture de l'entrée on peut utiliser deux méthodes efficaces pour lire le fichier, et écrire de nouveau. D'abord, je suggère de l'écriture dans un fichier temporaire (c'est de cette façon
sed
remplace du texte dans un fichier trop). Un avantage de cette méthode est que le dernier mouvement est probablement va être une opération atomique.Ou si vous avez vraiment ne voulez pas avoir un fichier temporaire, et donc de tout garder en mémoire, puis utiliser ce code:
Ne pas oublier la parenthèse fermante 😉
Noter que - contrairement à d'autres réponses - je suis en utilisant
.replace
au lieu de.replaceAll
. La seule différence est que ce dernier interprète le premier argument comme une expression régulière au lieu d'une chaîne littérale. À la fois remplacer toutes les occurrences, dans ce cas, il n'est pas nécessaire pour les expressions régulières, et peut seulement donner lieu à un comportement indésirable en raison de caractères spéciaux.OriginalL'auteur Yeti