2010-12-11 22 views
14

Tengo un programa que lee un archivo de texto y lo procesa para que se separe en secciones.C# ¿Cómo saltear el número de líneas mientras lee un archivo de texto usando Stream Reader?

Entonces, la pregunta es ¿cómo se puede cambiar el programa para permitir que el programa saltee la lectura de las primeras 5 líneas del archivo mientras usa Stream Reader para leer el archivo?

¿Podría alguien aconsejar sobre los códigos? ¡Gracias!

Los Códigos:

class Program 
{ 
    static void Main(string[] args) 
    { 
     TextReader tr = new StreamReader(@"C:\Test\new.txt"); 

     String SplitBy = "----------------------------------------"; 

     // Skip first 5 lines of the text file? 
     String fullLog = tr.ReadToEnd(); 

     String[] sections = fullLog.Split(new string[] { SplitBy }, StringSplitOptions.None); 

     //String[] lines = sections.Skip(5).ToArray(); 

     foreach (String r in sections) 
     { 
      Console.WriteLine(r); 
      Console.WriteLine("============================================================"); 
     } 
    } 
} 
+1

¿cuál es el problema con el uso de la línea comentada? –

+0

Es mostrar a los expertos que el método .split no funciona. – JavaNoob

+0

posible duplicado de [C# ¿Cómo se saltan las líneas en el archivo de texto después de que el texto se haya convertido en una matriz?] (Http://stackoverflow.com/questions/4417916/c-how-to-skip-lines-in-text-file-after -text-coverted-to-array) – ChrisF

Respuesta

22

Pruebe lo siguiente

// Skip 5 lines 
for(var i = 0; i < 5; i++) { 
    tr.ReadLine(); 
} 

// Read the rest 
string remainingText = tr.ReadToEnd(); 
+0

¡Gracias funciona bien! – JavaNoob

8

Si se fijan las líneas a continuación, la forma más eficiente es el siguiente:

using(Stream stream = File.Open(fileName, FileMode.Open)) 
{ 
    stream.Seek(bytesPerLine * (myLine - 1), SeekOrigin.Begin); 
    using(StreamReader reader = new StreamReader(stream)) 
    { 
     string line = reader.ReadLine(); 
    } 
} 

Y si las líneas varían de longitud, entonces tendrá que leerlos en línea a la vez de la siguiente manera:

using (var sr = new StreamReader("file")) 
{ 
    for (int i = 1; i <= 5; ++i) 
     sr.ReadLine(); 
} 
+2

Solo una nota, a diferencia de las otras soluciones, aquí no se molestará en leer las líneas que omite, y debería ser mucho más rápido que las demás. – Mathieson

0

supongo que es tan simple como:

static void Main(string[] args) 
    { 
     var tr = new StreamReader(@"C:\new.txt"); 

     var SplitBy = "----------------------------------------"; 

     // Skip first 5 lines of the text file? 
     foreach (var i in Enumerable.Range(1, 5)) tr.ReadLine(); 
     var fullLog = tr.ReadToEnd(); 

     String[] sections = fullLog.Split(new string[] { SplitBy }, StringSplitOptions.None); 

     //String[] lines = sections.Skip(5).ToArray(); 

     foreach (String r in sections) 
     { 
      Console.WriteLine(r); 
      Console.WriteLine("============================================================"); 
     } 
    } 
6

Si usted quiere usarlo más veces en su programa, entonces tal vez una buena idea para hacer una clase personalizada heredada de StreamReader con la capacidad para saltear líneas.

Algo como esto podría hacer:

class SkippableStreamReader : StreamReader 
{ 
    public SkippableStreamReader(string path) : base(path) { } 

    public void SkipLines(int linecount) 
    { 
     for (int i = 0; i < linecount; i++) 
     { 
      this.ReadLine(); 
     } 
    } 
} 

después de esto se puede utilizar la función de la SkippableStreamReader saltarse líneas. Ejemplo:

SkippableStreamReader exampleReader = new SkippableStreamReader("file_to_read"); 

//do stuff 
//and when needed 
exampleReader.SkipLines(number_of_lines_to_skip); 
+0

Prefiero usar un método de extensión. – modiX

3

Voy a añadir dos sugerencias más a la lista.

Si siempre habrá un archivo, y sólo se va a leer, sugiero esto:

var lines = File.ReadLines(@"C:\Test\new.txt").Skip(5).ToArray(); 

File.ReadLines no bloquea el archivo de otros y sólo carga en la memoria las líneas necesarias.

Si su corriente puede provenir de otras fuentes, entonces le sugiero este enfoque:

class Program 
{ 
    static void Main(string[] args) 
    { 
     //it's up to you to get your stream 
     var stream = GetStream(); 

     //Here is where you'll read your lines. 
     //Any Linq statement can be used here. 
     var lines = ReadLines(stream).Skip(5).ToArray(); 

     //Go on and do whatever you want to do with your lines... 
    } 
} 

public IEnumerable<string> ReadLines(Stream stream) 
{ 
    using (var reader = new StreamReader(stream)) 
    { 
     while (!reader.EndOfStream) 
     { 
      yield return reader.ReadLine(); 
     } 
    } 
} 

El bloque iterador limpiar automáticamente una vez que haya terminado con él. Here es un artículo de Jon Skeet que profundiza sobre cómo funciona exactamente (desplácese hacia abajo a la sección "Y finalmente ...").

Cuestiones relacionadas