2010-01-25 18 views
6

aquí está el código que estoy usandoC# saltarse primera línea de un archivo de texto

 using (FileStream fs = new FileStream(filename, FileMode.Open)) 
     using (StreamReader rdr = new StreamReader(fs)) 
     { 
      while (!rdr.EndOfStream) 
      { 
       for (int z = 0; z < 2; z++) 
       { 

        string[] lines = rdr.ReadLine().Split('|'); 
        { 
         sb.AppendLine(";Re"); 
         sb.AppendLine("@C PAMT " + lines[3]); 
         sb.AppendLine("@T " + lines[0]); 
         sb.AppendLine("@D @I\\" + lines[1]).Replace("I:\\", ""); 
         sb.AppendLine(lines[2].Replace(";", "\r\n"); 
        } 
       } 
      } 
     } 

     using (FileStream fs = new FileStream(outputfilename, FileMode.Create)) 
     using (StreamWriter writer = new StreamWriter(fs)) 
     { 
      writer.Write(sb.ToString()); 
     } 

Todo lo que quiero es o bien omitir la primera línea de la StreamReader o saltar toda la primera StringBuilder. Pensé que lo haría, pero no es así.

Nota: me gustaría evitar un foreach.

+0

¿Por qué quieres evitar 'foreach'? –

Respuesta

7

¿Por qué no acaba de leer la primera línea y no hacer nada con ella?

using (StreamReader rdr = new StreamReader(fs)) 
{ 
    rdr.ReadLine(); 
    ... 

o si usted no quiere hacer eso, tienen una variable fuera iy prueba para i! = 0

+1

Corrígeme si me falta algo, pero eso es exactamente lo que dijo JaredPar, excepto que no manejará el caso de un archivo vacío. –

20

¿Por qué no acaba de agregar la siguiente línea inmediatamente después de crear la variable rdr?

if (!rdr.EndOfStream) {rdr.ReadLine();} 
+0

Esa sería mi primera suposición, sí. –

+0

sí, pero necesito hacer esto para todas las líneas, no solo la 2da línea –

3

¿Qué tal

if(z > 0) 
{ 
    // All of your sb.Append stuff 
} 

EDIT:

using (FileStream fs = new FileStream(filename, FileMode.Open)) 
using (StreamReader rdr = new StreamReader(fs)) 
{ 
    bool passedFirstline = false; 
    while (!rdr.EndOfStream) 
    { 
     string[] lines = rdr.ReadLine().Split('|'); 
     if(passedFirstLine)      
     { 
      sb.AppendLine(";Re"); 
      sb.AppendLine("@C PAMT " + lines[3]); 
      sb.AppendLine("@T " + lines[0]); 
      sb.AppendLine("@D @I\\" + lines[1]).Replace("I:\\", ""); 
      sb.AppendLine(lines[2].Replace(";", "\r\n"); 
     } 
     else 
     { 
      passedFirstLine = true; 
     } 
    } 
} 

using (FileStream fs = new FileStream(outputfilename, FileMode.Create)) 
using (StreamWriter writer = new StreamWriter(fs)) 
{ 
    writer.Write(sb.ToString()); 
} 
+0

Su bucle for está dentro del tiempo ... eso me parece incorrecto. Estoy dudando de que su código siquiera funcione. Creo que habría errores al final del archivo. – rball

+0

@rball: Bueno, a menos que tuviera más de 3 líneas. Entonces, como nada avanzaría nunca a rdr, su tiempo sería infinito. Déjame editar y sugerir algo mejor. –

1

Sé que no todo el mundo es un fan de la utilización de la palabra clave siguen, pero en casos como este casi me gusta porque de la legibilidad Puede cambiar el siguiente código para usar a continue:

string[] lines = rdr.ReadLine().Split('|'); 
{ 
    if (z == 0) continue; // Skip first line 

    sb.AppendLine(";Re"); 
    sb.AppendLine("@C PAMT " + lines[3]); 
    sb.AppendLine("@T " + lines[0]); 
    sb.AppendLine("@D @I\\" + lines[1]).Replace(@"I:\", ""); 
    sb.AppendLine(lines[2].Replace(";", "\r\n"); 
} 
0
using (FileStream fs = new FileStream(filename, FileMode.Open)) 
using (StreamReader rdr = new StreamReader(fs)) { 
    rdr.ReadLine(); // skip the first line 
    string line = null; 
    while ((line = rdr.ReadLine()) != null) { 
    string[] lines = line.Split('|'); 
    sb.AppendLine(";Re"); 
    sb.AppendLine("@C PAMT " + lines[3]); 
    sb.AppendLine("@T " + lines[0]); 
    sb.AppendLine("@D @I\\" + lines[1]).Replace("I:\\", ""); 
    sb.AppendLine(lines[2].Replace(";", "\r\n"); 
    } 
} 

if (sb.Length == 0) return; // return if nothing was processed 

using (FileStream fs = new FileStream(outputfilename, FileMode.Create)) 
using (StreamWriter writer = new StreamWriter(fs)) 
{ 
    writer.Write(sb.ToString()); 
} 
0

Si desea utilizar más veces en su programa, entonces es tal vez sea una buena idea crear una clase personalizada heredada de StreamReader con la capacidad de omitir 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); 
Cuestiones relacionadas