2016-10-04 133 views
0

我是新来的编码和我已经费尽了我的大脑在这一点,但真的无法解释这种对自己说:为什么这个while循环省略了第一次迭代?

我有这样的内容的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 

如果我在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

这两个代码段无需任何理由多次读取整个文件。只需使用ReadToEnd()一次或更好,ReadAllLines()。你只是一遍又一遍地读取相同的文件 –

+0

我希望它被逐行读取和逗号分隔。所以我必须做两个循环,不是吗? – pumuckl

+0

它适用于:string [] substrings = line.Split(','); – pumuckl

回答

4

让我们来看看你在做什么:

while ((line = file.ReadLine()) != null) 

所以你读取文件的第一行。接下来,你这样做:

string[] substrings = file.ReadToEnd().Split(','); 

你读到文件的其余部分,直到结束。它不会返回阅读您已阅读并跳过的第一行。这就是为什么它没有按预期工作。

我不知道什么样的正确行为应该是因为你的阅读似乎不是基于行(所以为什么首先使用ReadLine?)。你可以阅读自己,直到你遇到的第一个,,并在此基础上进一步处理。或者读取整个文件,如果它不像您在第二个语句中已经做的那么大。

此外,while循环是无稽之谈,因为你反复读到文件末尾。永远不会有第二次迭代!

+0

谢谢!其实,感谢你的帮助,我想到了这样的: string [] substrings = line.Split(','); 我(想我)需要它为我正在尝试编写的小程序按行读取。 – pumuckl

+0

欢迎您! @pumuckl –

2

这是因为您正在将第一行从文件读入变量行并且从不使用输出。

while ((line = file.ReadLine()) != null) 

那你休息文件的结束(但没有第一行)

3

您正在阅读的第一线,在这一点上

while ((line = file.ReadLine()) != null) 

可以代替做到这一点

while(!file.EndOfStream) 
+0

好的。那么 有什么问题? –

+0

@PatrickHofman然后OP读取并分割文件的* rest *。实际上,OP丢弃了第一行'。一个没有循环的'ReadToEnd'或'ReadAllLines'就足够了 –

+0

不,真的@PanagiotisKanavos但是为什么不是在答案中呢? –

相关问题