我一直在寻找一些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")
答案 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!