Comment trouver et remplacer du texte dans un fichier avec C #

Mon code jusqu’ici

StreamReader reading = File.OpenText("test.txt"); ssortingng str; while ((str = reading.ReadLine())!=null) { if (str.Contains("some text")) { StreamWriter write = new StreamWriter("test.txt"); } } 

Je sais comment trouver le texte, mais je ne sais pas comment remplacer le texte du fichier par le mien.

Lire tout le contenu du fichier. Faites un remplacement avec Ssortingng.Replace . Ecrire du contenu dans un fichier.

 ssortingng text = File.ReadAllText("test.txt"); text = text.Replace("some text", "new value"); File.WriteAllText("test.txt", text); 

Vous allez avoir du mal à écrire dans le même fichier que celui que vous lisez. Un moyen rapide consiste simplement à faire ceci:

 File.WriteAllText("test.txt", File.ReadAllText("test.txt").Replace("some text","some other text")); 

Vous pouvez mieux définir cela avec

 ssortingng str = File.ReadAllText("test.txt"); str = str.Replace("some text","some other text"); File.WriteAllText("test.txt", str); 

Vous devez écrire toutes les lignes lues dans le fichier de sortie, même si vous ne les modifiez pas.

Quelque chose comme:

 using (var input = File.OpenText("input.txt")) using (var output = new StreamWriter("output.txt")) { ssortingng line; while (null != (line = input.ReadLine())) { // optionally modify line. output.WriteLine(line); } } 

Si vous souhaitez effectuer cette opération sur place, le plus simple est d’utiliser un fichier de sortie temporaire et à la fin, de remplacer le fichier d’entrée par la sortie.

 File.Delete("input.txt"); File.Move("output.txt", "input.txt"); 

(Tenter d’effectuer des opérations de mise à jour au milieu d’un fichier texte est assez difficile à obtenir car avoir toujours la même longueur est difficile, car la plupart des encodages ont une largeur variable.)

EDIT: Plutôt que deux opérations de fichier pour remplacer le fichier d’origine, mieux vaut utiliser File.Replace("input.txt", "output.txt", null) . (Voir MSDN .)

Il est probable que vous devrez extraire le fichier texte en mémoire et effectuer les remplacements. Vous devrez alors écraser le fichier en utilisant la méthode que vous connaissez clairement. Donc, vous devriez d’abord:

 // Read lines from source file. ssortingng[] arr = File.ReadAllLines(file); 

Vous pouvez alors parcourir en boucle et remplacer le texte dans le tableau.

 var writer = new StreamWriter(GetFileName(baseFolder, prefix, num)); for (int i = 0; i < arr.Length; i++) { string line = arr[i]; line.Replace("match", "new value"); writer.WriteLine(line); } 

Cette méthode vous permet de contrôler les manipulations possibles. Ou, vous pouvez simplement faire le remplacement dans une ligne

 File.WriteAllText("test.txt", text.Replace("match", "new value")); 

J'espère que ça aide.

Voici comment je l’ai fait avec un fichier de plusieurs Go: j’ai utilisé deux manières différentes, la première: lire le fichier en mémoire et utiliser Regex Replace ou Ssortingng Replace. Ensuite, j’ajoute la chaîne entière à un fichier temporaire.

La seconde est en lisant le fichier temporaire ligne par ligne et en construisant manuellement chaque ligne en utilisant SsortingngBuilder et en ajoutant chaque ligne traitée au fichier de résultats.

La première méthode fonctionne bien pour les remplacements Regex généraux, mais elle consum de la mémoire si vous essayez de faire Regex.Matches dans un fichier volumineux.

  static void ProcessLargeFile() { if (File.Exists(outputDefsFileName)) File.Delete(outputDefsFileName); if (File.Exists(defTempProc1FileName)) File.Delete(defTempProc1FileName); if (File.Exists(defTempProc2FileName)) File.Delete(defTempProc2FileName); ssortingng text = File.ReadAllText(inputDefsFileName, Encoding.UTF8); // PROC 1 This opens entire file in memory and uses Replace and Regex Replace text = text.Replace("", ""); text = Regex.Replace(text, @"\", ""); File.WriteAllText(defTempProc1FileName, text); // PROC 2 This reads file line by line and uses Ssortingng.IndexOf and Ssortingng.Subssortingng and SsortingngBuilder to build the new lines using (var fileStream = File.OpenRead(defTempProc1FileName)) using (var streamReader = new StreamReader(fileStream, Encoding.UTF8)) { ssortingng line, newdef; while ((line = streamReader.ReadLine()) != null) { Ssortingng[] arr = line.Split('\t'); ssortingng def = arr[2]; newdef = Util.ProcessDoubleBrackets(def); //note: don't use File.AppendAllText, it opens the file every time. Instead open StreamWriter in the beginning and write to it. // File.AppendAllText(defTempProc2FileName, newdef + Environment.NewLine); } } } public static ssortingng ProcessDoubleBrackets(ssortingng def) { if (def.IndexOf("[[") < 0) return def; StringBuilder sb = new StringBuilder(); ... Some processing sb.Append(def.Substring(pos, i - pos)); ... Some processing return sb.ToString(); }