从C#中的StreamReader中排除最后一行

时间:2015-06-10 00:06:00

标签: c# datagridview int streamreader

我将一些DataGridView的数据保存到文本文件中(对于我引用每个单元格内容的数据),在TXT文件的最后一行,我存储了dataGridView的行数。在行的开头有一个“ - ”。

现在,我可以将我的数据完美地读入我的DVG,但是如何排除包含行数的最后一行并使用它来读取其存储的int?

我用于将数据读入DVG的代码:

void LoadDVGData()
    {
        StreamReader sr = new StreamReader(open.FileName);
        foreach (DataGridViewRow row in editDGV.Rows)
        {
            foreach (DataGridViewCell cell in row.Cells)
            {
                string content = sr.ReadLine();
                cell.Value = content;
            }
        }
        sr.Close();
    }

先谢谢。 - CCB

2 个答案:

答案 0 :(得分:1)

你只需要保持一个向前看的标记,这样你就可以回答这个问题,“这是最后一行吗?” (如果你有一条当前行,但没有下一行,那么你就位于最后一行。

这是一种方法,可能很简单:

void LoadDVGData()
{
  using ( StreamReader sr = new StreamReader(open.FileName) )
  {
    string currentLine = sr.ReadLine() ;
    string nextLine    = sr.ReadLine() ;

    foreach (DataGridViewRow row in editDGV.Rows)
    {
      foreach (DataGridViewCell cell in row.Cells)
      {
        if ( currentLine == null ) throw new InvalidOperationException("Hmph. We seem to have run out of input data");

        cell.Value = currentLine ;

        currentLine = nextLine ;
        nextLine = sr.ReadLine() ;

      } //end cols loop
    } // end rows loop

  } // end using block

  return;
}

答案 1 :(得分:0)

我认为sr是读取文本文件的StreamReader - 您应该将其包含在usingtry..finally块中,以确保在出现错误时进行正确的清理。

对于文本文件与DataGridView(DGV)中的行数/单元格数不匹配的情况,您当前的设置无法正常工作:您尝试阅读每个单元格的文件中的值,如果指定了错误的文件,您可能会尝试读取超出文件末尾的值。您应该对此代码进行更多错误处理,因为在读取文件期间可能存在各种问题点:行太少,行的单元格太少,特定单元格的值无效等等。

您的设置不适合处理。如果您控制文本文件的格式,我建议更改格式,以便第一行是计数,然后文本文件中的每一行都使用{{1}描述DGV的完整行}作为分隔符。加载这样的文件要简单得多。 (您甚至可以在第一行上拥有行数和列数,以便为您提供有关数据的更多信息;您永远不会有太多关于输入数据的元数据。)

所以你的新文本文件格式如下:

TAB

如果您无法更改文本文件格式,那么只需读取文件两次 - 首先查找文件的末尾并回读到最后一行的末尾 - 然后只读取一行 - 它应该是行数。您可以通过在文件末尾查找换行符来完成此操作。然后只需寻找文件的开头并从中读取这么多行。

修改

正如@vesan在问题中评论的那样,如果您的输入文件不是很大,您只需拨打3{TAB}5 R1C1{TAB}R1C2{TAB}R1C3{TAB}R1C4{TAB}R1C5{CRLF} R2C1{TAB}R2C2{TAB}R2C3{TAB}R2C4{TAB}R2C5{CRLF} R3C1{TAB}R3C2{TAB}R3C3{TAB}R3C4{TAB}R3C5{CRLF} 即可获得File.ReadAllLines()中的所有行。然后处理它是微不足道的。但是,对于任何文件大小,使用更方便的文件格式都可以。读取所有行假定输入文件不是很大。

编辑2:

例如(为简洁省略了错误处理):

string[]

如果你的文字文件是正确的,var sLines = File.ReadAllLines ( open.FileName ); var nRowCount = int.Parse ( sLines[sLines.Length - 1] ); var nIndex = 0; foreach (DataGridViewRow row in editDGV.Rows) { foreach (DataGridViewCell cell in row.Cells) { cell.Value = sLines[nIndex]; nIndex++; } } 将有正确的行数,你永远不会真正读取数组的最后一个元素到DGV。