Cómo encontrar y reemplazar texto en un archivo con C #

Mi código hasta el momento

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

Sé cómo encontrar el texto, pero no tengo idea de cómo reemplazar el texto del archivo con el mío.

Lea todo el contenido del archivo. Haga un reemplazo con String.Replace . Escribir el contenido de nuevo en el archivo.

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

Te resultará difícil escribir en el mismo archivo desde el que estás leyendo. Una manera rápida es simplemente hacer esto:

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

Puedes explicarlo mejor con

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

Debe escribir todas las líneas que lee en el archivo de salida, incluso si no las cambia.

Algo como:

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

Si desea realizar esta operación en su lugar, la forma más fácil es usar un archivo de salida temporal y al final reemplazar el archivo de entrada con la salida.

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

(Intentar realizar operaciones de actualización en el medio del archivo de texto es bastante difícil de conseguir porque siempre es difícil tener el reemplazo de la misma longitud, dado que la mayoría de las codificaciones son de ancho variable).

EDITAR: en lugar de dos operaciones de archivo para reemplazar el archivo original, mejor utilizar File.Replace("input.txt", "output.txt", null) . (Ver MSDN .)

Es probable que tenga que tirar el archivo de texto a la memoria y luego hacer los reemplazos. Luego tendrá que sobrescribir el archivo usando el método que usted conoce claramente. Entonces, primero:

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

A continuación, puede recorrer y reemplazar el texto en la matriz.

 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); } 

este método te da cierto control sobre las manipulaciones que puedes hacer. O bien, simplemente puede hacer el reemplazo en una línea

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

Espero que esto ayude.

Así es como lo hice con un archivo GB múltiple: utilicé 2 formas diferentes, la primera: leer el archivo en la memoria y usar Regex Replace o String Replace. Luego agrego toda la cadena a un archivo temporal.

El segundo es leyendo el archivo temporal línea por línea y construyendo manualmente cada línea usando StringBuilder y añadiendo cada línea procesada al archivo de resultados.

El primer método funciona bien para reemplazos generales de Regex, pero consume memoria si lo intentas hacer Regex.Matches en un archivo grande.

  static void ProcessLargeFile() { if (File.Exists(outputDefsFileName)) File.Delete(outputDefsFileName); if (File.Exists(defTempProc1FileName)) File.Delete(defTempProc1FileName); if (File.Exists(defTempProc2FileName)) File.Delete(defTempProc2FileName); string 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 String.IndexOf and String.Substring and StringBuilder to build the new lines using (var fileStream = File.OpenRead(defTempProc1FileName)) using (var streamReader = new StreamReader(fileStream, Encoding.UTF8)) { string line, newdef; while ((line = streamReader.ReadLine()) != null) { String[] arr = line.Split('\t'); string 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 string ProcessDoubleBrackets(string 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(); }