2012-03-08 74 views
1

在C#中按字符讀取文件字符的最簡單方法是什麼?C# - 按字符讀取外部CSV文件字符

目前,我通過調用System.io.file.ReadLine()逐行閱讀。我看到有一個Read()函數,但它不返回字符...

我也想知道如何檢測使用這種方法的行結束...輸入文件在問題是一個CSV文件....

回答

5

打開TextReader(例如,通過File.OpenText - 注意File是一個靜態類,所以你無法創建它的實例),並反覆調用Read。返回int,而不是char因此它可以指示文件的末尾:

int readResult = reader.Read(); 
if (readResult != -1) 
{ 
    char nextChar = (char) readResult; 
    // ... 
} 

或者循環:

int readResult; 
while ((readResult = reader.Read()) != -1) 
{ 
    char nextChar = (char) readResult; 
    // ... 
} 

或瞭解更多質樸善良:

public static IEnumerable<char> ReadCharacters(string filename) 
{ 
    using (var reader = File.OpenText(filename)) 
    { 
     int readResult; 
     while ((readResult = reader.Read()) != -1) 
     { 
      yield return (char) readResult; 
     } 
    } 
} 

... 

foreach (char c in ReadCharacters("foo.txt")) 
{ 
    ... 
} 

注意所有默認情況下,File.OpenText將使用UTF-8編碼。如果不是你想要的,明確指定編碼。

編輯:要查找一行的結尾,您需要檢查字符是否爲\n ......如果這是Windows文本文件,您可能還要特別處理\r

但是,如果你想每個,爲什麼不只是撥打ReadLine?你總是可以遍歷在隨後行的字符...

+0

一個片段我假設OP希望在文件中進行迭代_all_字符(「_閱讀character_文件字符「)。 – 2012-03-08 10:52:55

+0

@TimSchmelter:所以他們需要循環,直到它返回-1 ...將用更多的代碼編輯,但我認爲這確實提供了足夠的信息。 – 2012-03-08 10:57:46

+0

我將如何檢測一行的結束? – user559142 2012-03-08 11:56:11

0

這裏是msdn

using (StreamReader sr = new StreamReader(path)) 
{ 
    char[] c = null; 

    while (sr.Peek() >= 0) 
    { 
     c = new char[1]; 
     sr.Read(c, 0, c.Length); 

     // do something with c[0] 
    } 
} 
+0

我知道這不是你的代碼,但這是一個可怕的方法國際海事組織。爲什麼當'Read()'完成所需的工作? – 2012-03-08 11:00:55