【问题标题】:How to start reading file after designated number of lines如何在指定行数后开始读取文件
【发布时间】:2013-09-30 00:27:51
【问题描述】:

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

这是我的代码:

 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”

谢谢大家

【问题讨论】:

  • 您是否选择了正确的文件?
  • 您是否可以在 git hub 或其他共享上共享文件?我记得读过第一篇文章并愿意提供帮助。
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • @jcwrequests 让我知道你是否还想帮助我上传

标签: c# file stream


【解决方案1】:

您可以跳过 StreamReader 并简单地使用 File.ReadAllLines 并加上 Skip()

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

textBox1.Lines = lines;

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

补充说明

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

【讨论】:

  • 让我试一试.. 当它声明“.ToArray()”时,它会转到什么数组
  • @user2788405 - var lines 将是 .ToArray() 创建的数组。 .ToArray() 可能是不必要的,因为 ReadAllLines 返回一个数组。
  • @user2788405 - TextBox.Lines 需要 string[](数组),但没有 .ToArray() 的查询将返回 System.Linq.Enumerable.SkipIterator<string>,它不会被隐式转换。 .ToArray() 只是将查询结果转换为数组。
  • 请检查您的电子邮件,我需要更多说明
【解决方案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++;
}

【讨论】:

    【解决方案3】:
    • 您不向文本框添加文本。你重写它。
    • 如果 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;
    

    【讨论】:

      猜你喜欢
      • 2014-02-13
      • 2017-04-11
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      相关资源
      最近更新 更多