使用 Python 和 Regex 清理平面文件 - 由于 CRLF 错误,随机记录被分成部分记录

问题描述

我正在清理以管道分隔的平面文件,但遇到了一个问题,即我在整个文件中有随机的 CRLF,这些 CRLF 将有效记录(带有 24 个预期分隔符)破坏为跨后续行的部分记录。

>

这些 CRLF 的位置似乎相对随机,并且每条记录的这些 CRLF 的数量各不相同。举个例子:

这是我所看到的(使用更简单的 3 个分隔符示例):

this|is|a|test
don't|be
alarmed|
if|there
is|a|broken|record
above|this|is|expected

可以看到第 2、3、4 行都是部分记录,应该是单条记录,有 3 个预期的分隔符。

这是我希望看到的/我正在尝试制作的:

this|is|a|test
don't|be alarmed|if|there
is|a|broken|record
above|this|is|expected

我清理这部分的目的是:

  1. 识别所有没有预期分隔符数量的记录(由于错误的 CRLF)
  2. 使用预期数量的分隔符将这些记录折叠成一个完整的记录(通过删除错误的 CRLF)

我主要在 Jupyter 笔记本中执行此操作。以下是迄今为止显示出希望的一种方法

这是我的方法

  1. 识别以下行: 没有 24 个分隔符 未遵循 一行 24 个分隔符

    • 使用以下正则表达式执行此操作: ^(?!(.*?\|){24}).*\n(?!(.*?\|){24}.*\n)
    • (上述第二部分的基本原理是忽略部分记录的最后一行,因此我们不会用下面的替换来弄乱随后的好行)
  2. 然后我可以使用 re.sub() 函数将那些行的 '\n' 替换为 ' '

This has worked with the small 3-delimiter sample data 我在上面的例子中展示了,但是由于“灾难性回溯”,我的正则表达式在规模上失败了。事实上,即使有 6 条记录的真实数据样本,它也会由于灾难性的回溯而失败。

关于改进我的正则表达式以避免灾难性回溯的任何想法或建议,或有关如何解决此类 CRLF 问题的任何其他建议。

非常感谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)