我是编码的新手,我一直绞尽脑汁,但实际上无法向我解释:
我有一个csv文件,内容如下:
line1_value1, line1_value2, line1_value3
line2_value1, line2_value2, line2_value3
line3 value1, line3_value2, line3_value3
出于测试目的,我尝试使用以下代码打印出值:
static void Main(string[] args)
{
Program test = new Program();
test.printFile();
}
System.IO.StreamReader file = new System.IO.StreamReader(@"C:\some_file.csv");
public void printFile()
{
string line;
while ((line = file.ReadLine()) != null)
{
string[] substrings = file.ReadToEnd().Split(',');
foreach (var substring in substrings) {
Console.WriteLine(substring);
}
Console.ReadLine();
}
}
但它省略了第一行并打印:
line2_value1
line2_value2
line2_value3
line3 value1
line3_value2
line3_value3
如果我在do while循环中执行它,它就像预期的那样工作:
public void printFile()
{
string line;
do
{
string[] substrings = file.ReadToEnd().Split(',');
foreach (var substring in substrings)
{
Console.WriteLine(substring);
}
}
while ((line = file.ReadLine()) != null);
Console.ReadLine();
}
打印:
line1_value1
line1_value2
line1_value3
line2_value1
line2_value2
line2_value3
line3 value1
line3_value2
line3_value3
为什么第一行没有出现在while循环中?
提前致谢!
答案 0 :(得分:4)
让我们看看你在做什么:
while ((line = file.ReadLine()) != null)
所以你从文件中读到了第一行。接下来,你这样做:
string[] substrings = file.ReadToEnd().Split(',');
您将文件的剩余部分读到最后。它不会回过头来阅读您已阅读并跳过的第一行。这就是为什么它没有按预期工作的原因。
我不确定正确的行为应该是什么,因为您的阅读似乎不是基于行的(所以为什么首先使用ReadLine
?)。在您遇到第一个,
之前,您可以自己阅读并根据它进一步处理。或者读取整个文件,如果它不像你在第二个语句中那样做得太大。
而且,while
循环是无意义的,因为无论如何你都要读到文件的末尾。永远不会有第二次迭代!
答案 1 :(得分:3)
此时您正在阅读第一行
while ((line = file.ReadLine()) != null)
你可以这样做
while(!file.EndOfStream)
答案 2 :(得分:2)
这是因为您正在从文件读取第一行到变量行,并且从不使用输出。
while ((line = file.ReadLine()) != null)
然后你剩下的文件结束(但没有第一行)