2010-09-17 376 views
2

這是在.NET中讀取大型csv文件的最高性能方式? 使用FileStream?或另一類? 謝謝!閱讀大型csv文件

+1

我真誠地希望你[不滾動自己的CSV分析器(http://secretgeek.net/csv_trouble.asp)。 – 2010-09-17 14:19:55

回答

1

如果你想把它全部讀入內存,一個簡單的File.ReadAllText()將會很好。

編輯:如果你的文件確實很大,那麼你可以使用StreamReader類,詳見here。這種方法有時是不可避免的,但應該避免出於風格原因。請參閱here進行更深入的討論。

+0

是的,但如果文件很大,最好逐行閱讀 – 2010-09-17 14:11:33

+0

閱讀大文件的「正確風格」是什麼? – 2010-09-17 15:00:49

3

您可以使用FileInfo.OpenText返回的StreamReader

Dim file As New FileInfo("path\to\file") 

Using reader As StreamReader = file.OpenText() 
    While Not reader.EndOfStream 
     Dim nextLine As String = reader.ReadLine() 
     ProcessCsvLine(nextLine) 
    End While 
End Using 
1

這樣做的最有效的方法是利用遞延執行的LINQ。您可以創建一個簡單的Linq-To-Text函數,該函數一次只讀取一行,並對其進行處理,然後繼續。由於該文件非常大,因此這非常有用。

我會停止使用StreamReader類的ReadBlock或ReadBlock或ReadToEnd方法,因爲它們傾向於一次讀取多行或者甚至讀取文件中的所有行。與一次讀取一行相比,這會消耗更多的內存。

public static IEnumerable<string> Lines(this StreamReader source) 
{ 
    String line; 

    if (source == null) 
     throw new ArgumentNullException("source"); 

    while ((line = source.ReadLine()) != null) 
    { 
     yield return line; 
    } 
} 

請注意,該函數是StreamReader類的擴展方法。這意味着它可以作如下用途:

class Program 
{ 
    static void Main(string[] args) 
    { 
     using(StreamReader streamReader = new StreamReader("TextFile.txt")) 
     { 
      var tokens = from line in streamReader.Lines() 
      let items = line.Split(',')    
      select String.Format("{0}{1}{2}", 
       items[1].PadRight(16), 
       items[2].PadRight(16), 
       items[3].PadRight(16)); 

     } 
    } 
} 
+0

當你可以在你的第二個代碼塊中簡單地使用'While(line = streamReader.ReadLine()!= null)'時,這看起來就像很多典禮。 – 2010-09-17 15:06:42