我有一个控制台应用程序,我需要读取一些.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吗? 感谢名单
答案 0 :(得分:1)
你应该逐行阅读,ReadToEnd只会将完整的文件内容加载到内存中,如果你有大文件就会得到OutOfMemoryException
答案 1 :(得分:1)
有两件事需要考虑
1)而不是String使用StringBuilder作为 Dim builder As 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()