2012-10-15 69 views
0

我有一個控制檯應用程序,我需要閱讀幾個.csv文件。 我沒有任何問題要閱讀兩個第一個相當ligth(每個約10000記錄)。 但是,當它開始讀第三個(重的方式,約220 000條記錄)我一直有錯誤「OutOfMemoryException異常是未處理:類型的System.OutOfMemoryException「未處理的異常出現在mscorlib.dll」OutOfMemoryException當讀取.csv

我不不懂見過S爲兩個第一CSV工作正常...

這裏是我的函數讀取的CSV文件,在分割時出現錯誤:

Function FileToString(filePath As String) As String() 
    Dim myfile As New StreamReader(filePath, System.Text.Encoding.GetEncoding("iso-8859-1")) 
    Dim allData As String = myfile.ReadToEnd() 
    Dim rows As String() = allData.Split(vbCr.ToCharArray) 
    Return rows 
End Function 

我怎麼能避免這種情況?有沒有更好的方法來閱讀csv? 感謝名單

+3

不要讀整個文件一次。 – adatapost

+2

你爲什麼試圖自己解析CSV而不是使用其中一個CSV庫? – PhonicUK

回答

1

有兩件事情要考慮

1)替代字符串的使用StringBuilder作爲 昏暗助洗劑作爲新的StringBuilder

2)對於文件讀取使用緩衝方法取代myfile.ReadToEnd()

爲例Ë

Function FileToString(filePath As String) As String 
    Dim f As System.IO.FileStream 
    Dim mylength As Integer 
    Dim i As Integer 

    f = New System.IO.FileStreamfilePath, IO.FileMode.Open, IO.FileAccess.Read) 

    Dim streamLength As Integer = Convert.ToInt32(f.Length) 
    Dim fileData As Byte() = New Byte(streamLength) {} 

    f.Read(fileData , 0, streamLength) 
    f.Close() 
    return fileData.ToString(); 
End Function 

如果你想然後一行行下面的代碼使用

Dim sr As StreamReader = New StreamReader("TestFile.txt") 
Dim line As String 
Do 
    line = sr.ReadLine() 
    Console.WriteLine(Line) 
Loop Until line Is Nothing 
sr.Close() 
+0

我是編程中的新手,如何通過緩衝區逐行讀取我的文件? – blop

+0

請檢查修改代碼 –

+0

Thx爲您的答案,但我想在for循環中做什麼?我無法獲得我的文件行... – blop

1

你應該只由線讀取線,ReadToEnd的將只是完整的文件內容加載到內存中,如果你有你有OutOfMemoryException異常

大文件