C#跳过文本文件的第一行

6

这是我正在使用的代码:

        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。我原以为使用for循环可以实现,但事实并非如此。
注意:我想避免使用foreach。

你为什么想要避免使用 foreach - Sarah Vessels
6个回答

20

在创建rdr变量后,为什么不立即添加以下行?

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

那将是我第一个猜测,是的。 - Michael Myers
是的,但我需要对所有行进行操作,而不仅仅是第二行。 - user222427

8
为什么不只读取第一行而不对其进行任何操作呢?
using (StreamReader rdr = new StreamReader(fs))
{
  rdr.ReadLine();
  ...

或者如果您不想这样做,可以有一个外部变量i并测试i!= 0

2
如果我漏掉了什么,请纠正我,但这正是JaredPar所说的,只是它无法处理空文件的情况。 - Michael Myers

4
如何呢?
if(z > 0)
{
  // All of your sb.Append stuff
}

编辑:

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

他的for循环在while循环内部...这对我来说似乎是错误的 - 我怀疑他的代码是否能正常工作。我认为会出现文件结束错误。 - rball
@rball:嗯,除非他有超过3行的代码。否则,由于没有任何东西会推进rdr,他的while循环将是无限的。让我编辑并建议更好的方法。 - Joel Etherton

2
如果您想在程序中多次使用它,则创建一个自定义类继承自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);

1

我知道并不是每个人都喜欢使用continue关键字,但在像这样的情况下,由于可读性,我几乎喜欢它。您可以更改以下代码以使用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()); 
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接