[英]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
您应该将其包装在using
或try..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.