代码之家  ›  专栏  ›  技术社区  ›  J Weezy

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

  •  0
  • J Weezy  · 技术社区  · 6 年前

    问题: 解析文件末尾缺少新行字符的文件的最佳方法是什么?我应该试着抓住OutOfMemoryException吗?或者,有更好的办法吗?

    背景: 我正在使用streamreader的read line()方法解析日志文件,以读取下一行。所以,基本的循环结构如下:

    while ((line = sr.ReadLine()) != null)
    {
          // Parse the file
    }
    

    即使是在大文件(即,>2GB)上,也可以很好地工作。但是,当下一行不为空时 不包含新行字符,则streamreader只读取空格,直到耗尽所有内存并引发outOfMemoryException。这是处理文件末尾丢失的新行字符的最佳方法吗?或者,有没有更好的方法来处理这个问题?

    注意:正在从IIS Exchange服务器创建文件。如果不使用我们的it组,文件在创建过程中似乎会被截断,导致最后一行由于缺少数据而变得不好。

    研究: 我在so上找到了一个帖子(见下文),上面提到使用 File.ReadFile . 虽然它在缺少新行字符的小得多的文件(即<2gb)上工作,但在大文件(即>2gb)上仍然失败。

    https://stackoverflow.com/a/13416225

    https://docs.microsoft.com/en-us/dotnet/api/system.io.file.readlines?redirectedfrom=MSDN&view=netframework-4.7.2#System_IO_File_ReadLines_System_String_

    编辑

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

    下面是日志文件的副本,删除了所有数据内容,除了每行末尾的时间戳和换行符。在最后一行中,我包含了数据截止之前的最后一个数据元素(端口号)。注意到最后一行缺少新行字符了吗?

    enter image description here

    2 回复  |  直到 6 年前
        1
  •  1
  •   Andrew    6 年前

    这应该有效: 应该在尝试读取下一行之前检查endofstream。 还添加了一些空检查。

    while (!sr.EndOfStream)
    {
      line = sr.ReadLine()?.Trim() ?? "";
      // Parse the line
    }
    
        2
  •  0
  •   J Weezy    6 年前

    我已经确认了我们的IT部门的文件有问题。发生的事情是,最初通过网络传输到本地的过程似乎经历了一个小插曲。我重新传输了文件并成功解析了它。还有更多的行。让我不高兴的是,网络和本地的文件大小是一样的,所以在我的研究工作中,我没有考虑重新传输文件。

    文件传输过程似乎首先将完整文件分配为空,然后开始用数据填充它。如果标准文本编辑器(如记事本、notepad++、excel等)无法打开超大文件,请好运地诊断这些文件。我不得不使用超编辑,问题变得显而易见。

    根据hans passant对一个相关问题的评论(见下面的链接),streamreader的readline()方法将处理大型文件,就像它在内部处理文件系统缓存一样。所以,OutOfMemoryException不应该是个问题。我想这是针对内存不足的计算机,而不是坏文件。

    感谢大家的故障排除和我的任何中断道歉。

    Unable to read large log file with MemoryMappedViewStream