2010-01-25 7 views
6

est ici le code que je utiliseC# sauter première ligne d'un fichier texte

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

Tout ce que je veux est soit sauter la première ligne du StreamReader ou sauter toute la première stringbuilder. Je pensais que le pour le ferais, mais ce n'est pas le cas.

Note: je voudrais recommander un foreach.

+0

Pourquoi voulez-vous éviter 'foreach'? –

Répondre

7

Pourquoi ne pas simplement lire la première ligne et ne rien faire avec?

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

ou si vous ne voulez pas le faire, ont une variable en dehors i et test i! = 0

+1

Corrigez-moi si quelque chose me manque, mais c'est exactement ce que JaredPar a dit, sauf qu'il ne gérera pas le cas d'un fichier vide. –

20

Pourquoi ne pas simplement ajouter la ligne suivante immédiatement après avoir créé la variable rdr?

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

Ce serait ma première supposition, oui. –

+0

oui mais je dois le faire pour toutes les lignes pas seulement la 2ème ligne –

3

Que diriez-vous

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

Sa boucle for est à l'intérieur du temps ... qui me semble erroné - je doute que son code fonctionne même. Je pense qu'il y aurait des erreurs de fin de fichier. – rball

+0

@rball: Eh bien, sauf s'il avait plus de 3 lignes. Puis, parce que rien ne pourrait jamais avancer rdr, son temps serait infini. Laissez-moi éditer et suggérer quelque chose de mieux. –

1

Je sais que tout le monde est fan d'utiliser le continuer mot-clé, mais dans des cas comme cela, je presque à cause de la lisibilité. Vous pouvez modifier le code suivant pour utiliser un 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 vous voulez utiliser plusieurs fois dans votre programme alors il est peut-être une bonne idée de faire une classe personnalisée héritée de StreamReader avec la possibilité de sauter des lignes.

Quelque chose comme cela pourrait faire:

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

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

après cela, vous pouvez utiliser la fonction de SkippableStreamReader sauter les lignes. Exemple:

SkippableStreamReader exampleReader = new SkippableStreamReader("file_to_read"); 

//do stuff 
//and when needed 
exampleReader.SkipLines(number_of_lines_to_skip); 
Questions connexes