¿Cómo eliminar una línea de un archivo de texto en C #?

Tengo un problema: ¿cómo puedo eliminar una línea de un archivo de texto en C #?

Lea el archivo, elimine la línea en la memoria y vuelva a colocar el contenido en el archivo (sobrescritura). Si el archivo es grande, puede leerlo línea por línea y crear un archivo temporal, reemplazando luego el original.

Para archivos muy grandes, haría algo como esto

string tempFile = Path.GetTempFileName(); using(var sr = new StreamReader("file.txt")) using(var sw = new StreamWriter(tempFile)) { string line; while((line = sr.ReadLine()) != null) { if(line != "removeme") sw.WriteLine(line); } } File.Delete("file.txt"); File.Move(tempFile, "file.txt"); 

Actualización Originalmente escribí esto en 2009 y pensé que podría ser interesante con una actualización. Hoy podrías lograr lo anterior usando LINQ y ejecución diferida

 var tempFile = Path.GetTempFileName(); var linesToKeep = File.ReadLines(fileName).Where(l => l != "removeme"); File.WriteAllLines(tempFile, linesToKeep); File.Delete(fileName); File.Move(tempFile, fileName); 

El código anterior es casi exactamente el mismo que el del primer ejemplo, leyendo línea por línea y manteniendo una cantidad mínima de datos en la memoria.

Sin embargo, un descargo de responsabilidad podría estar en orden. Ya que estamos hablando de archivos de texto aquí, rara vez tendrá que usar el disco como medio de almacenamiento intermedio. Si no se trata de archivos de registro muy grandes, no debería haber problemas para leer los contenidos en la memoria y evitar tener que lidiar con el archivo temporal.

 File.WriteAllLines(fileName, File.ReadLines(fileName).Where(l => l != "removeme").ToList()); 

Tenga en cuenta que The .ToList es crucial aquí para forzar la ejecución inmediata. También tenga en cuenta que todos los ejemplos asumen que los archivos de texto están codificados en UTF-8.

Estoy de acuerdo con John Saunders, esto no es realmente específico de C #. Sin embargo, para responder a su pregunta: básicamente necesita volver a escribir el archivo. hay dos maneras de hacer esto.

  • Lea todo el archivo en la memoria (por ejemplo, con File.ReadAllLines )
  • Elimine la línea ofensiva (en este caso, probablemente sea más fácil convertir la matriz de cadenas en una List luego eliminar la línea)
  • Escriba todo el rest de las líneas (por ejemplo, con File.WriteAllLines ) – potencialmente convierta la List en una matriz de cadenas nuevamente utilizando ToArray

Eso significa que debes saber que tienes suficiente memoria. Una alternativa:

  • Abra el archivo de entrada y un nuevo archivo de salida (como un TextReader / TextWriter , por ejemplo, con File.OpenText y File.CreateText )
  • Leer una línea ( TextReader.ReadLine ) – si no desea eliminarla, escríbala en el archivo de salida ( TextWriter.WriteLine )
  • Cuando haya leído todas las líneas, cierre tanto el lector como el escritor (si using instrucciones de using para ambos, esto sucederá automáticamente)
  • Si desea reemplazar la entrada con la salida, elimine el archivo de entrada y luego mueva el archivo de salida a su lugar.

Extendí lo que sugirió Markus Olsson, y surgió esta clase que agrega varias cadenas de búsqueda y un par de eventos:

 public static class TextLineRemover { public static void RemoveTextLines(IList linesToRemove, string filename, string tempFilename) { // Initial values int lineNumber = 0; int linesRemoved = 0; DateTime startTime = DateTime.Now; // Read file using (var sr = new StreamReader(filename)) { // Write new file using (var sw = new StreamWriter(tempFilename)) { // Read lines string line; while ((line = sr.ReadLine()) != null) { lineNumber++; // Look for text to remove if (!ContainsString(line, linesToRemove)) { // Keep lines that does not match sw.WriteLine(line); } else { // Ignore lines that DO match linesRemoved++; InvokeOnRemovedLine(new RemovedLineArgs { RemovedLine = line, RemovedLineNumber = lineNumber}); } } } } // Delete original file File.Delete(filename); // ... and put the temp file in its place. File.Move(tempFilename, filename); // Final calculations DateTime endTime = DateTime.Now; InvokeOnFinished(new FinishedArgs {LinesRemoved = linesRemoved, TotalLines = lineNumber, TotalTime = endTime.Subtract(startTime)}); } private static bool ContainsString(string line, IEnumerable linesToRemove) { foreach (var lineToRemove in linesToRemove) { if(line.Contains(lineToRemove)) return true; } return false; } public static event RemovedLine OnRemovedLine; public static event Finished OnFinished; public static void InvokeOnFinished(FinishedArgs args) { Finished handler = OnFinished; if (handler != null) handler(null, args); } public static void InvokeOnRemovedLine(RemovedLineArgs args) { RemovedLine handler = OnRemovedLine; if (handler != null) handler(null, args); } } public delegate void Finished(object sender, FinishedArgs args); public class FinishedArgs { public int TotalLines { get; set; } public int LinesRemoved { get; set; } public TimeSpan TotalTime { get; set; } } public delegate void RemovedLine(object sender, RemovedLineArgs args); public class RemovedLineArgs { public string RemovedLine { get; set; } public int RemovedLineNumber { get; set; } } 

Uso:

  TextLineRemover.OnRemovedLine += (o, removedLineArgs) => Console.WriteLine(string.Format("Removed \"{0}\" at line {1}", removedLineArgs.RemovedLine, removedLineArgs.RemovedLineNumber)); TextLineRemover.OnFinished += (o, finishedArgs) => Console.WriteLine(string.Format("{0} of {1} lines removed. Time used: {2}", finishedArgs.LinesRemoved, finishedArgs.TotalLines, finishedArgs.TotalTime.ToString())); TextLineRemover.RemoveTextLines(new List { "aaa", "bbb" }, fileName, fileName + ".tmp"); 

Para eliminar un elemento del archivo de texto, primero mueva todo el texto a una lista y elimine el elemento que desee. Luego, escriba el texto almacenado en la lista en el archivo de texto

  List quotelist=File.ReadAllLines(filename).ToList(); string firstItem= quotelist[0]; quotelist.RemoveAt(0); File.WriteAllLines(filename, quotelist.ToArray()); return firstItem; 

Yo simplemente:

  • Abra el archivo para lectura / escritura
  • Leer / buscar a través de él hasta el comienzo de la línea que desea eliminar
  • Establezca el puntero de escritura en el puntero de lectura actual
  • Lea hasta el final de la línea que estamos eliminando y omita los delimitadores de línea nueva (contando el número de caracteres a medida que avanzamos, lo llamaremos línea)
  • Lea byte por byte y escriba cada byte en el archivo
  • Cuando termine de truncar el archivo a (orig_length – nline).

Hola chicos, escribí un método para eliminar líneas de archivos. Este progtwig usa el using System.IO

Ver mi código:

  void File_DeleteLine(int Line, string Path) { StringBuilder sb = new StringBuilder(); using (StreamReader sr = new StreamReader(Path)) { int Countup = 0; while (!sr.EndOfStream) { Countup++; if (Countup != Line) { using (StringWriter sw = new StringWriter(sb)) { sw.WriteLine(sr.ReadLine()); } } else { sr.ReadLine(); } } } using (StreamWriter sw = new StreamWriter(Path)) { sw.Write(sb.ToString()); } } 

¿Por qué no puedes usar esto? Primero, crea una matriz:

 string[] lines = File.ReadAllLines(openFileDialog1.FileName); 

Luego, busque la línea que necesita eliminar y reemplácela por “”:

 lines[x].Replace(lines[x], ""); 

¡Hecho!