Saltar al contenido

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

Buscamos por diferentes espacios para así tenerte la solución a tu dilema, en caso de alguna difcultad puedes dejarnos tu inquietud y te responderemos porque estamos para ayudarte.

Solución:

Para muy archivos 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");

Actualizar Originalmente escribí esto en 2009 y pensé que podría ser interesante con una actualización. Hoy podría 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 igual que el primer ejemplo, lee línea por línea y mantiene una cantidad mínima de datos en la memoria.

Sin embargo, un descargo de responsabilidad podría estar en orden. Dado que aquí estamos hablando de archivos de texto, muy rara vez tendrá que usar el disco como un medio de almacenamiento intermedio. Si no está tratando con archivos de registro muy grandes, no debería haber problemas para leer el contenido 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 el .ToList Aquí es crucial 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.

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, es posible que desee leerlo línea por línea y crear un archivo temporal, y luego reemplazar el original.

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.

  • Leer 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 string array en una List luego elimine la línea)
  • Escriba todo el resto de las líneas hacia atrás (por ejemplo, con File.WriteAllLines) – convertir potencialmente el List en una string array de nuevo usando ToArray

Sin embargo, eso significa que debes saber que tienes suficiente memoria. Una alternativa:

  • Abra tanto el archivo de entrada como un nuevo archivo de salida (como TextReader/TextWriterpor ejemplo con File.OpenText y File.CreateText)
  • Leer una línea (TextReader.ReadLine) – si no desea eliminarlo, escríbalo en el archivo de salida (TextWriter.WriteLine)
  • Cuando haya leído todas las líneas, cierre tanto el lector como el escritor (si usa using declaraciones 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.

Comentarios y calificaciones de la guía

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *