2010-01-25 16 views
6

ecco il codice che sto utilizzandoC# per saltare prima riga di un file di testo

 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()); 
     } 

Tutto quello che voglio è né saltare la prima riga del StreamReader o saltare l'intero primo StringBuilder. Ho pensato che lo farebbe ma non lo fa.

Nota: vorrei fare un foreach.

+0

Perché vuoi evitare 'foreach'? –

risposta

7

Perché non basta leggere la prima riga e non fare nulla con esso?

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

o se non si vuole fare questo, hanno una variabile fuori i e banco di prova per i! = 0

+1

Correggimi se mi manca qualcosa, ma questo è esattamente quello che ha detto JaredPar, tranne che non gestirà il caso di un file vuoto. –

20

Perché non aggiungere la riga seguente subito dopo aver creato la variabile rdr?

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

Questa sarebbe la mia prima ipotesi, si. –

+0

sì, ma ho bisogno di fare questo per tutte le linee, non solo la 2a riga –

3

Come su

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

Il ciclo for è all'interno del tempo ... mi sembra sbagliato - dubito che il suo codice funzioni anche. Penso che ci sarebbero degli errori di fine file. – rball

+0

@rball: Beh, a meno che non avesse più di 3 linee. Quindi, poiché nulla sarebbe mai avanzato, il suo tempo sarebbe stato infinito. Fammi modificare e suggerire qualcosa di meglio. –

1

So che non tutti sono un fan di utilizzare la parola chiave continuano, ma in casi come questo io quasi come a causa di la leggibilità. È possibile modificare il seguente codice per utilizzare un continuare:

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

Se si desidera utilizzarlo più volte nel vostro programma allora è forse una buona idea rendere una classe personalizzata ereditata da StreamReader con la possibilità di saltare le linee.

Qualcosa di simile potrebbe fare:

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

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

dopo questo è possibile utilizzare la funzione del SkippableStreamReader per saltare le linee. Esempio:

SkippableStreamReader exampleReader = new SkippableStreamReader("file_to_read"); 

//do stuff 
//and when needed 
exampleReader.SkipLines(number_of_lines_to_skip); 
Problemi correlati