2010-01-25 2 views
6

здесь код я используюC# пропуская первую строку текстового файла

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

Все, что я хочу, чтобы либо пропустить первую строку StreamReader или пропустить весь первый StringBuilder. Я думал, что это сделает, но это не так.

Примечание: я хотел бы наложить предлог.

+0

Почему вы хотите избежать «foreach»? –

ответ

7

Почему бы не просто прочитать первую строку и ничего не сделать с ней?

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

или если вы не хотите, чтобы сделать это, есть вне переменным я и теста для г! = 0

+1

Исправьте меня, если мне что-то не хватает, но это именно то, что сказал JaredPar, за исключением того, что он не будет обрабатывать случай с пустым файлом. –

20

Почему бы не просто добавить следующую строку сразу после создания переменной rdr?

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

Это была бы моя первая догадка, да. –

+0

да, но мне нужно сделать это для всех строк не только для 2-й строки – 2010-01-25 19:02:04

3

Как насчет

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

Его петля внутри внутри ... что мне кажется неправильным - я сомневаюсь, что его код даже работает. Я думаю, что будет конец ошибок файла. – rball

+0

@ rball: Хорошо, если у него не было более 3 строк. Тогда, потому что ничто никогда не продвинет rdr, его пока будет бесконечно. Позвольте мне изменить и предложить что-то лучшее. –

1

Я знаю, что не каждый поклонник используя продолжить ключевое слово, но в таких случаях я почти как это из-за читаемость. Вы можете изменить следующий код, чтобы продолжить:

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

Если вы хотите использовать его несколько раз в вашей программе, то это может быть, хорошая идея создать собственный класс, унаследованный от StreamReader, с возможностью пропуска строк.

Нечто подобное можно было сделать:

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

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

после этого вы можете использовать функцию SkippableStreamReader, чтобы пропустить строки. Пример:

SkippableStreamReader exampleReader = new SkippableStreamReader("file_to_read"); 

//do stuff 
//and when needed 
exampleReader.SkipLines(number_of_lines_to_skip); 
Смежные вопросы