0

我有一个控制台应用程序,我需要在其中读取一些 .csv 文件。我没有问题阅读前两个非常轻的(每个大约 10 000 条记录)。但是当它开始读取第三个(更重,大约 220 000 条记录)时,我一直遇到错误“OutOfMemoryException 未处理:mscorlib.dll 中发生了“System.OutOfMemoryException”类型的未处理异常”

我不明白它对于前两个 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的方法?谢谢

4

2 回答 2

1

你应该逐行阅读,ReadToEnd 只会将完整的文件内容加载到内存中,如果你有大文件,你会得到 OutOfMemoryException

于 2012-10-15T08:24:57.007 回答
1

有 2 件事需要考虑

1) 而不是 String 使用 StringBuilder 作为 Dim builder 作为 New 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()
于 2012-10-15T08:27:24.803 回答