【发布时间】:2019-07-05 12:37:24
【问题描述】:
问题:解析文件末尾缺少换行符的文件的最佳方法是什么?我应该尝试一下并抓住 OutOfMemoryException 吗?或者,有没有更好的方法?
背景:我正在使用 StreamReader 的 Readline() 方法解析日志文件以读取下一行。因此,基本的循环结构如下所示:
while ((line = sr.ReadLine()) != null)
{
// Parse the file
}
这很好用,即使是大文件(即 > 2GB)。但是,当下一行不为 null 并且 不包含换行符时,StreamReader 只会读取空格,直到耗尽所有内存并抛出 OutOfMemoryException。这是处理文件末尾缺少的换行符的最佳方法吗?或者,有没有更好的方法来处理这个问题?
注意:文件是从 IIS Exchange Server 创建的。如果没有深入了解我们的 IT 团队,该文件似乎在创建过程中被截断,导致最后一行因为缺少数据而出错。
研究:我在 SO(见下文)上发现了一篇关于使用 File.ReadFile 的帖子。虽然它适用于缺少换行符的小得多的文件(即 2GB)。
https://stackoverflow.com/a/13416225
编辑
编译器停在下面代码示例中的 While 行。问题不在于代码,而在于文件。我无法发布我们的日志文件。但是,为了演示,在 NotePad++ 中创建几行数据。对于文件的最后一行,删除换行符,然后运行文件。 StreamReader 将在最后一行爆炸,因为它找不到行尾。
以下是删除了所有数据内容的日志文件副本,时间戳和每行末尾的换行符除外。对于最后一行,我包含了数据中断之前的最后一个数据元素(端口号)。注意到最后一行缺少换行符了吗?
【问题讨论】:
-
Note: the file is being created from IIS Exchange Server.如果生成的文件不正确,我会努力修复那里的错误。 -
顺便说一句,捕获内存不足的异常是没有用的。到那时,你的记忆力已经不够了——你无能为力。
-
我无法重现此问题。读取没有尾随
\r\n的最后一行,然后对ReadLine()的下一次调用返回 null。肯定有其他问题。 -
这不是 StreamReader.ReadLine() 的行为。请发布一个实际的minimal reproducible example 来演示该问题。我可以生成自己的文件,最后缺少 CRLF 进行测试。
-
" StreamReader 将在最后一行爆炸,因为它找不到行尾"? - 完全错误。
StreamReader将文件结尾视为字符串结尾。
标签: c# parsing streamreader