限制从CSV文件读取的数据大小,使其仅读取整行



我想用C#读取大约10GB的CSV文件。我不能一次读取一行文件,并且一次最多读取32MB的块。

如何限制我正在读取的数据的大小,同时确保我只读取整行数据?这意味着,如果一个完整的32MB意味着只读取100.5行,那么我只想读取完整的100行,而忽略半行,即使这意味着读取量小于32MB。

这是我正在思考的骨架代码(那里的评论包含更多问题):

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?
}

您不需要确保读取的是整行。

将文件分块读取到缓冲区中。

逐个字符处理缓冲区中的每一行,直到到达换行符为止。如果你在一行上,到达缓冲区的末尾,保留这部分,读取下一个区块,并将从新读取到换行的所有内容与上一次读取的剩余部分连接起来。

如果缓冲区的最后一个字节是一个新行,那么您就有了一整行,并且可以简单地移动到下一个块。如果没有,请读取下一个chunk-第一个字节将是新行,或者在它之前有其他字符。无论哪种方式,都可以将所有内容连接到新行(即使这意味着0个字符),然后从下一个开始。

如果您在换行符后点击文件的末尾,就完成了。如果您在处理非换行符时碰到了文件末尾,则由您决定是将它们保留为有效行还是丢弃它们。

这与循环缓冲区非常相似。

另一种解决方案可能是使用BufferedStream并指定缓冲区大小。然后,只需逐字节地读取每条换行符或EOF。

最新更新