【发布时间】:2014-01-11 22:38:46
【问题描述】:
我想使用 C# 读取大约 10GB 的 CSV 文件。我无法一次读取一行文件,并且一次读取的最大块限制为 32MB。
如何限制我正在阅读的数据的大小,但同时确保我只阅读完整的行?这意味着如果一个完整的 32MB 意味着仅读取 100.5 行,那么我只想读取完整的 100 行并省略半行,即使这意味着读取小于 32MB。
这是我正在考虑的骨架代码(那里的cmets持有更多问题):
const int MAX_BUFFER = 33554432; //32MB
byte[] buffer = new byte[MAX_BUFFER];
int bytesRead;
using (System.IO.FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
while ((bytesRead = fileStream.Read(buffer, 0, MAX_BUFFER)) != 0)
{
//should I somehow analyze here if what I'm reading containing only full lines?
//and if so, how can I know that I'm not currently reading something less than 32MB
//meaning bytesRead is less than that and that maybe I'm going to read the rest of the line in the next iteration?
}
【问题讨论】:
-
File.EnumerateLines能解决你的问题吗? -
@usr 你写的好像不存在...
-
似乎被称为“ReadLines”。 msdn.microsoft.com/en-us/library/dd383503(v=vs.110).aspx 那怎么样?
-
@Steve 但我怎么知道我在块末尾读到的不是整行?您似乎认为我总是在块的末尾读到一行
-
@Yonatan - 我已经将我所有的 cmets 移到了答案中。如果这对您有用,请接受它。不过,您可能需要等待更多输入。
标签: c# csv filestream