2011-08-10 26 views
8

que actualmente puede quitar la última línea de un archivo de texto usando:Extracción de la primera línea de un archivo de texto en C#

var lines = System.IO.File.ReadAllLines("test.txt"); 
    System.IO.File.WriteAllLines("test.txt", lines.Take(lines.Length - 1).ToArray()); 

Aunque, ¿cómo es posible eliminar en su lugar el principio del archivo de texto?

+0

Quizás no sea la respuesta que está buscando, pero ¿qué tal si reemplazamos los bytes que representan la primera línea a NULL? La próxima vez que pueda File.ReadAllLines, omitirá todos los bytes NULL iniciales – Polity

Respuesta

8

En lugar de lines.Take su lugar se puede utilizar, como lines.Skip:

var lines = File.ReadAllLines("test.txt"); 
File.WriteAllLines("test.txt", lines.Skip(1).ToArray()); 

para truncar al principio a pesar de que la técnica utilizada (leer todo el texto y escribir todo de nuevo) es muy ineficiente.

Acerca de la manera eficiente: La ineficiencia proviene de la necesidad de leer todo el archivo en la memoria. A la inversa, podría ser fácilmente buscar en un flujo y copiar el flujo a otro archivo de salida, eliminar el original y renombrar el anterior. Ese sería igual de rápido y, sin embargo, consumiría mucha menos memoria.

Truncar un archivo al final es mucho más fácil. Puede encontrar la posición de trunacción y llamar al FileStream.SetLength().

+1

Es ineficiente, sí, pero ¿hay alguna forma de truncar el comienzo de un archivo? –

+0

Sí, simplemente omite escribirlo como se indica en mi respuesta. –

+2

@ssg: Si omite la parte de escritura, ¿cómo se actualiza el archivo? Supongo que me falta algo ... – Chris

4
var lines = System.IO.File.ReadAllLines("test.txt"); 
System.IO.File.WriteAllLines("test.txt", lines.Skip(1).ToArray()); 

Skip elimina el número dado de elementos de la que comienzan de la secuencia. Take elimina todos los elementos menos el número dado de final de la secuencia.

4

Aquí es una alternativa:

 using (var stream = File.OpenRead("C:\\yourfile")) 
     { 
      var items = new LinkedList<string>(); 
      using (var reader = new StreamReader(stream)) 
      { 
       reader.ReadLine(); // skip one line 
       string line; 
       while ((line = reader.ReadLine()) != null) 
       { 
        //it's far better to do the actual processing here 
        items.AddLast(line); 
       } 
      } 
     } 

actualización

Si necesita un IEnumerable<string> y no quiere perder la memoria que podría hacer algo como esto:

public static IEnumerable<string> GetFileLines(string filename) 
    { 
     using (var stream = File.OpenRead(filename)) 
     { 
      using (var reader = new StreamReader(stream)) 
      { 
       reader.ReadLine(); // skip one line 
       string line; 
       while ((line = reader.ReadLine()) != null) 
       { 
        yield return line; 
       } 
      } 
     } 
    } 


    static void Main(string[] args) 
    { 
     foreach (var line in GetFileLines("C:\\yourfile.txt")) 
     { 
      // do something with the line here. 
     } 
    } 
+1

¿Qué sucede si no hay líneas? – Deleted

+1

nada, ya que 'ReadLine' devuelve nulo en ambas llamadas. – jgauffin

+0

Inteligente. Tiene mucho sentido. – Deleted

0

Para eliminar la primera línea de un archivo de texto

System.IO.StreamReader file = new System.IO.StreamReader(filePath); 
string data = file.ReadToEnd(); 
file.Close(); 
data = Regex.Replace(data, "<.*\n", ""); 
System.IO.StreamWriter file = new System.IO.StreamWriter(filePath, false); 
file.Write(data); 
file.Close(); 
+1

Regex es realmente excesivo en este escenario – mike

Cuestiones relacionadas