繁体   English   中英

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

[英]Exclude last line from StreamReader in C#

我将一些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();
    }

提前致谢。 -建行

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

这是一种方法,它可能变得非常简单:

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

我假设sr是读取您的文本文件的StreamReader您应该将其包装在usingtry..finally块中,以确保在发生错误时进行正确的清除。

当前的设置在文本文件与DataGridView (DGV)中的行数/单元格数不匹配的情况下效果不佳:您尝试从文件中读取每个单元格的值,如果输入错误指定了文件,您可以尝试读取文件末尾之外的内容。 您应该在此代码周围进行更多的错误处理,因为在读取文件期间可能会出现各种问题:行太少,行的单元格太少,特定单元格的值无效等。

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

因此,新的文本文件格式如下所示:

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}

如果您无法更改文本文件格式,则只需读取文件两次-首先查找到文件末尾,然后再读取到最后一行之前的行末-然后仅从文件中读取一行-它应该是该行计数。 您可以通过在文件末尾查找换行符来实现。 然后,只需查找文件的开头并从文件中读取很多行。

编辑:

正如@vesan在该问题下评论的那样,如果您的输入文件不是很大,则只需调用File.ReadAllLines()即可获取string[]所有行。 然后处理它是微不足道的。 但是,对于任何文件大小,都可以使用更方便的文件格式。 读取所有行均假定输入文件不大。

编辑2:

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

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++;
    }
}

如果您的文本文件正确,则nRowCount将具有正确的行数,并且您将永远不会真正将数组的最后一个元素读入DGV。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM