删除以CRLF结尾的行中的CRLF

时间:2018-04-12 00:59:52

标签: python-3.x delimited-text

我一直在寻找一些python代码来计算记录中的分隔符,但不能找到任何示例。

我有一个管道分隔的文本文件,其中双引号用于文本限定符,CRLF定义行的结尾。与往常一样,某些列在文本中具有CRLF,这会混淆输出格式。

  

“开始记录”|“”|“SomeText”|“更多关于CRLF的内容然后更多文字”|“甚至可以包含”CRLF“|”“CRLF

目前我在notepad ++中打开了文件,并使用正则表达式手动完成  (?<!")\r\n 找到没有前面的双引号的CRLF。因为我有几个要修复的大文件,我想让python转到记录的开头,计算5个管道并删除那个计数但只有非常基本的python知识的CRLF。 我有一些基本的python代码来查找和替换一些字符,但不认为它足以完成所需的操作。

replacement = {'","':'"|"'}
lines = [] with open('C:\OriginalRplPipe.txt') as infile:
for line in infile:
    for src, target in replacement.items():
        line = line.replace(src,target)
    lines.append(line)with open('C:\PipeDel.txt', 'w') as outfile:
for line in lines:
    outfile.write(line)
    print ("Finished")

2 个答案:

答案 0 :(得分:0)

以下代码可能正是您要找的。不幸的是,到目前为止,我无法克服一个缺陷:如果一个CRLF出现在两个双引号之间,但是在第一个双引号之后,它就不会被删除。除此之外,代码对我有用。

from pathlib import Path
import re

regex = rb'(".*?[^"])\r\n(.*?")'
reo = re.compile(regex)

in_file = Path('input.txt')
out_file = Path('output.txt')

old_content = in_file.read_bytes()    # read as binary file although it is a text file!

new_content = reo.sub(rb'\1\2', old_content)

out_file.write_bytes(new_content)    # write as binary file although it is a text file!

但现在看到我的第二个答案。

答案 1 :(得分:0)

与此同时,我设法在第一个答案中删除了这个漏洞。下面是新代码,它应该做你想要的。它应该独立于CRLF在记录字段中的数量和位置。

from pathlib import Path
import re

regex_lin = rb'(".*?"\|".*?"\|".*?"\|".*?"\|".*?"\|".*?"\r\n)' # split file into lines
reo_lin = re.compile(regex_lin, re.DOTALL)
regex_rec = rb'".*?"'                                          # split line into records
reo_rec = re.compile(regex_rec, re.DOTALL)

in_file = Path('input.txt')
out_file = Path('output.txt')

old_content = in_file.read_bytes()                             # read as binary file although it is a text file!

lines = reo_lin.findall(old_content)
new_content = b''
for line in lines:
    old_records = reo_rec.findall(line)
    new_line= b''
    for record in old_records:
        record = record.replace(b'\r', b'')
        record = record.replace(b'\n', b'')
        new_line = new_line + record + b'|'
    new_content = new_content + new_line + b'\r\n'

out_file.write_bytes(new_content)                              # write as binary file although it is a text file!