Tôi đang sử dụng C# để đọc tệp CSV văn bản thuần túy ~ 120 MB. Ban đầu tôi đã thực hiện phân tích cú pháp bằng cách đọc nó theo từng dòng, nhưng gần đây đã xác định rằng đọc toàn bộ nội dung tệp vào bộ nhớ đầu tiên nhanh hơn nhiều lần. Việc phân tích cú pháp đã khá chậm vì CSV có dấu phẩy được nhúng bên trong dấu ngoặc kép, có nghĩa là tôi phải sử dụng phân tách regex. Đây là người duy nhất tôi đã tìm thấy rằng làm việc đáng tin cậy:.NET System.OutOfMemoryException trên String.Split() của tệp CSV 120 MB
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
Để làm phân tích cú pháp sau khi đọc toàn bộ nội dung vào bộ nhớ, tôi làm một tách chuỗi trên kí tự xuống dòng để có được một mảng chứa mỗi dòng. Tuy nhiên, khi tôi làm điều này trên tập tin 120 MB, tôi nhận được một System.OutOfMemoryException
. Tại sao nó hết bộ nhớ một cách nhanh chóng khi máy tính của tôi có RAM 4 GB? Có cách nào tốt hơn để nhanh chóng phân tích cú pháp CSV phức tạp không?
chuỗi là con khốn của khoa học máy tính. một điều ác cần thiết, nhưng tôi vẫn muốn ai đó sẽ tìm ra một cách tốt hơn! –