2016-10-04 162 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但是爲什麼不是在答案中呢? –

相關問題