在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();
}
提前感谢。——建行
您只需要保持一个向前看的标记,这样您就可以回答这个问题,"这是最后一行吗?"(如果有当前行,但没有下一行,则定位在最后一行。
这里有一种方法,它可能是最简单的:
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
-您应该将其包装在using
或try..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。