C#解析文件末尾缺少新行字符的文件

C#解析文件末尾缺少新行字符的文件,c#,parsing,streamreader,C#,Parsing,Streamreader,问题:解析文件末尾缺少新行字符的文件的最佳方法是什么?我应该使用try-and-catch-on-out-of-memory异常吗?或者,有更好的方法吗 背景:我正在使用StreamReader的Readline()方法解析日志文件,以便在下一行中读取。因此,基本循环结构如下所示: while ((line = sr.ReadLine()) != null) { // Parse the file } 即使在大文件(即>2GB)上,这也很有效。但是,当下一行不为null且不包含新行

问题:解析文件末尾缺少新行字符的文件的最佳方法是什么?我应该使用try-and-catch-on-out-of-memory异常吗?或者,有更好的方法吗

背景:我正在使用StreamReader的Readline()方法解析日志文件,以便在下一行中读取。因此,基本循环结构如下所示:

while ((line = sr.ReadLine()) != null)
{
      // Parse the file
}
即使在大文件(即>2GB)上,这也很有效。但是,当下一行不为null且不包含新行字符时,StreamReader只读取空格,直到耗尽所有内存并引发OutOfMemoryException。这是处理文件末尾缺少新行字符的最佳方法吗?或者,有没有更好的方法来处理这个问题

注意:文件是从IIS Exchange Server创建的。如果不深入了解我们的IT组,文件似乎在创建过程中被截断,导致最后一行由于缺少数据而变得不好

研究:我在SO(见下文)上发现了一条帖子,提到使用
File.ReadFile
。虽然它可以在小得多的文件(即<2GB)上工作,但在大文件(即>2GB)上仍然失败

编辑


编译器在下面代码示例中的While行停止。问题不在于代码,而在于文件。我不能发布我们的日志文件。但是,为了演示,请在NotePad++中创建几行数据。对于文件的最后一行,删除换行符,然后运行文件。StreamReader将在最后一行爆炸,因为它找不到行的结尾

下面是日志文件的副本,删除了所有数据内容,但每行末尾的时间戳和换行符除外。对于最后一行,我包含了数据切断之前的最后一个数据元素(端口号)。请注意,最后一行缺少新行字符

这应该可以: 在尝试读取下一行之前,应检查EndOfStream。 还添加了一些null检查

while (!sr.EndOfStream)
{
  line = sr.ReadLine()?.Trim() ?? "";
  // Parse the line
}

我已经确认我们的it团队的文件是坏的。发生的事情是,最初通过网络传输到本地的过程似乎遇到了问题。我重新传输了文件,并成功解析了它。还有更多的行。使我感到不快的是,网络和本地之间的文件大小是相同的,所以我在研究过程中没有考虑重新传输文件。 文件传输过程似乎首先将完整文件分配为空,然后开始用数据填充它。如果诊断出标准文本编辑器(如记事本、记事本++、Excel等)无法打开的超大文件,请好运。我不得不使用超编辑,问题变得显而易见

根据Hans Passant对一个相关问题的评论(参见下面的链接),StreamReader的Readline()方法可以处理大文件,就像它在内部处理文件系统缓存一样。因此,OutOfMemoryException不应该是问题。我想这是针对内存不足的计算机,而不是坏文件

谢谢你们所有人的故障排除,并对任何打扰表示歉意


注意:该文件是从IIS Exchange Server创建的。
如果生成的文件不正确,我会设法修复那里的错误。顺便说一句,捕获内存不足异常是毫无用处的。在这一点上,你已经没有记忆了——你无能为力。我无法重现这个问题。读取最后一行没有结尾的
\r\n
,然后下一次调用
ReadLine()
返回null。一定是其他问题。这不是StreamReader.ReadLine()的行为。请发表一篇实际的文章来说明这个问题。我可以生成自己的文件,该文件末尾缺少一个CRLF进行测试。“StreamReader将在最后一行爆炸,因为它找不到该行的结尾”?-完全错误
StreamReader
将文件结尾视为字符串结尾。感谢您的帖子。我尝试了上面的实现。不幸的是,这不起作用-我仍然得到OutOfMemoryException错误。还有其他想法吗?