在c#中从StreamReader中排除最后一行

本文关键字:一行 最后 排除 中从 StreamReader | 更新日期: 2023-09-27 17:55:06

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

提前感谢。——建行

在c#中从StreamReader中排除最后一行

您只需要保持一个向前看的标记,这样您就可以回答这个问题,"这是最后一行吗?"(如果有当前行,但没有下一行,则定位在最后一行。

这里有一种方法,它可能是最简单的:

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)中的行/单元格数不匹配的情况,您当前的设置不能很好地工作:您尝试从每个单元格的文件中读取值,如果指定了错误的文件,您可能会尝试读取超出文件末尾的内容。您应该对这段代码进行更多的错误处理,因为在读取文件期间可能存在各种问题点:行太少,一行单元格太少,特定单元格的值无效,等等。

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

所以你的新文本文件格式看起来像:
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。