使用Python和正则表达式清理平面文件-由于CRLF错误,随机记录被分解为部分记录

使用Python和正则表达式清理平面文件-由于CRLF错误,随机记录被分解为部分记录,python,python-3.x,regex,data-cleaning,flat-file,Python,Python 3.x,Regex,Data Cleaning,Flat File,我正在清理一个以管道分隔的平面文件,遇到了一个问题,我在整个文件中都有随机的CRLF,它将有效记录(预期有24个分隔符)拆分为后续行中的部分记录 这些CRLF的位置似乎是相对随机的,每个记录中这些CRLF的数量各不相同。下面是一个例子: 下面是我看到的(使用一个更简单的3分隔符示例): this|is|a|test don't|be alarmed| if|there is|a|broken|record above|this|is|expected this|is|a|test don't|

我正在清理一个以管道分隔的平面文件,遇到了一个问题,我在整个文件中都有随机的CRLF,它将有效记录(预期有24个分隔符)拆分为后续行中的部分记录

这些CRLF的位置似乎是相对随机的,每个记录中这些CRLF的数量各不相同。下面是一个例子:

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

this|is|a|test
don't|be
alarmed|
if|there
is|a|broken|record
above|this|is|expected
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
this|is|a|test
don't|be alarmed|if|there
is|a|broken|record
above|this|is|expected
我这部分的清洁工作的目的是:

  • 识别所有没有预期分隔符数的记录(由于CRLF错误)
  • 将这些记录折叠成具有预期分隔符数的完整记录(通过删除错误的CRLF)
  • 我主要是在Jupyter笔记本上做的。以下是迄今为止显示出希望的一种方法

    以下是我的方法:

    this|is|a|test
    don't|be
    alarmed|
    if|there
    is|a|broken|record
    above|this|is|expected
    
    this|is|a|test
    don't|be alarmed|if|there
    is|a|broken|record
    above|this|is|expected
    
  • 标识以下行:没有24个分隔符且未遵循 按包含24个分隔符的行

    • 使用以下正则表达式执行此操作:
      ^(?(.*){24}.*\n(?(.*){24}.*\n)
    • (上面第二部分的基本原理是忽略部分记录的最后一行,这样我们就不会在下面的替换中弄乱后续的好行)
  • 然后我可以使用re.sub()函数将这些行的“\n”替换为“”

  • 我在上面的例子中展示了,但是在规模上,由于“灾难性的回溯”,我的正则表达式失败了。事实上,由于灾难性的回溯,即使有6条记录的真实数据样本,它也会失败

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


    非常感谢

    逐行读取文件,检查
    |
    s的计数,如果计数小于X,保留该行,读取下一行,附加到现有行数据,检查计数,必要时重复,一旦计数为X,将该行写入固定文件。如何解析该文件?发布你的代码。CSV文件实际上允许在带引号的字段中使用换行符。与其尝试“修复”文件,不如尽可能修改代码以处理字段中的换行符。另一方面,也许应该修复生成平面文件的代码,并确保文本字段被引用。我怀疑您使用了
    |
    而不是
    作为分隔符,因为在您的语言环境中
    是十进制分隔符。