我正在使用C#读取一个大约120 MB的纯文本CSV文件。最初,我通过逐行读取来解析它,但最近发现先将整个文件内容读入内存会快多次。由于CSV中有嵌在引号内的逗号,这意味着我必须使用正则表达式进行分割,因此解析已经相当慢了。下面是唯一一个可靠的正则表达式:
string[] fields = Regex.Split(line,
@",(?!(?<=(?:^|,)\s*\x22(?:[^\x22]|\x22\x22|\\\x22)*,)
(?:[^\x22]|\x22\x22|\\\x22)*\x22\s*(?:,|$))");
// from http://regexlib.com/REDetails.aspx?regexp_id=621
为了在将整个内容读入内存后进行解析,我使用换行符对字符串进行拆分,以获取包含每行的数组。然而,当我在120MB文件上执行此操作时,会出现System.OutOfMemoryException
。为什么我的计算机有4GB RAM,但它很快就会耗尽内存?有没有更好的方法来快速解析复杂的CSV文件?