0

我有以下文本文件。任务很简单:忽略所有蓝色的行并在箭头指示的位置开始读取文件。(我发布了一个类似的问题,但人们的回复不起作用,所以我决定结合答案并这次正确提问)

在此处输入图像描述

这是我的代码:

 private void button1_Click(object sender, EventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            StreamReader sr = new StreamReader(File.OpenRead(ofd.FileName));

            int i = 1;

            while (!sr.EndOfStream)
            {
                if (i > 8)
                    textBox1.Text = sr.ReadLine(); // As soon as i get to the arrow         (8th line, I want to display the line in the textbox in my application.)

                sr.ReadLine();
                i++;
            }

        }
    }
}

我的问题:我认为我的 while 循环根本不正确。当我尝试显示 while 循环包含的内容时,文本框中没有弹出任何内容。其次,这是我使用上面的代码得到的输出:

这显然是错误的,我什至不知道0小计和671等来自哪里。

在此处输入图像描述

我期望的输出是第一个箭头线:“1 MANDT CLIENT etc etc”

多谢你们

4

3 回答 3

4

您可以跳过StreamReader并简单地使用File.ReadAllLines以下Skip()内容:

var lines = File.ReadAllLines(ofd.FileName).Skip(8).ToArray();

textBox1.Lines = lines;

这假定为 MultiLine ( ) 设置了 TextBox textBox1.MultiLine = true;

附加说明

上面的 LINQ 查询将返回一个System.Linq.Enumerable.SkipIterator<string>; 最后.ToArray()的 the 将其转回一个数组,需要将其分配给textBox1.Lines,因为该属性需要 a string[]

于 2013-09-30T00:48:25.573 回答
2

您一直阅读到文件末尾,用每一行替换文本框的内容。如果您真的想要第一条未跳过的行,则需要跳出循环:

while (!sr.EndOfStream)
{
  if (i > 8)
  {
    textBox1.Text = sr.ReadLine(); 
    break;
  }

  sr.ReadLine();
  i++;
}

或者,如果您想要所有未跳过的行,

while (!sr.EndOfStream)
{
  string text = sr.ReadLine();

  if (i > 8)
    textBox1.Text += text + "\n";

  i++;
}
于 2013-09-30T00:36:18.057 回答
1
  • 您不向文本框添加文本。你重写它。
  • 如果 i > 8,你会双读 2 行,只写 1 行。

while (!sr.EndOfStream)
{
    string line = sr.ReadLine();
    if (i > 8)
    {
        textBox1.Text += line + Environment.NewLine;
    }
    i++;
}

读取文件的简单方法是使用File.ReadLines

string fileLines = File.ReadLines(ofd.FileName).Skip(8).Aggregate((current, next) => current + Environment.NewLine + next);
textBox1.Text = fileLines;
于 2013-09-30T00:39:28.743 回答