【发布时间】:2017-02-12 05:50:10
【问题描述】:
我是编码新手,我一直在为此绞尽脑汁,但真的无法向自己解释:
我有一个 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 循环中?
提前致谢!
【问题讨论】:
-
两个 sn-ps 都无缘无故地多次读取整个文件。只需使用
ReadToEnd()一次或更好,ReadAllLines()。你只是一遍又一遍地阅读同一个文件 -
我希望它可以按行读取并以逗号分隔。所以我必须分两次循环,不是吗?
-
它适用于:string[] substrings = line.Split(',');
-
ReadToEnd读取整个文件,而不仅仅是一行。如果你想读一行,你需要ReadLine。此外,您可以简单地使用ReadAllLines将所有行读入一个数组或使用ReadLines返回一个IEnumerable<string>,它将一次返回一行 -
但是对于我正在尝试编写的程序,我需要单独读取每一行(至少我认为我需要这个)。微软建议这样做:msdn.microsoft.com/en-gb/library/94223t4d.aspx.
标签: c# loops while-loop do-while