我有一个数据文件,其中的字段用双引号和字段分隔符括起来,如下所示:
field enclosure = "<field_value>"
sep = ||@@##因此,字段值的引号中的文本带有'LF‘和'CR LF’行分隔符,这会导致下一行打印到新行上-这可能会被误解为新记录,而实际上,它是一条记录的一部分,没有被换行到新行。
示例:
3||@@##14||@@##"2016-01-13 19:59:27"||@@##"2016-01-15 23:09:19"||@@##1162||@@##822||@@##1237||@@##\N||@@##"VHiujdfYshv"||@@##"---<LF>
...LF
"||@@##\N||@@##"2016-01-15 23:09:18"||@@##0||@@##1||@@##0||@@##0||@@##3||@@##1788||@@##\N||@@##205||@@##\N||@@##0||@@##\N||@@##\N||@@##\N||@@##\N||@@##\N||@@##\N||@@##1||@@##\N||@@##"251 Bgegf BHVcvytd Street<CR LF>
JHbsdbfh, RF 35214<CR LF>
<CR LF>
xyz@gmail.dhg.com<CR LF>
<CR LF>
@@##1788<LF>
4||@@##14||@@##"2016-01-25 22:08:53"||@@##"2016-02-15 20:32:08"||@@##1097||@@##933||@@##1262||@@##\N||@@##"VHiujdfYshv"||@@##"--- <LF>
...<LF>请注意,LF和CR LF实际上没有尖括号,这可能是给定的,但我提到它是为了绝对清楚。下面是它在notepad++文件上的一个片段。另外,请注意,我的数据包含'||@@##‘作为字段分隔符,'\N’表示na_values。
到目前为止,我是如何阅读这个文件的。我尝试使用pd.read_csv中的'quotechar‘和'quoting’参数,但它使用C解析器,分隔符使用Python解析器,所以python解析器被覆盖。如何读取此文件<在作为CSV读取之前处理它,或者在读取CSV文件时使用一些正则表达式?请帮帮忙。
df = pd.read_csv(z.open(filename),
encoding = 'utf8',
header=None,
sep='\|\|@@##',
na_values='\\N',
engine = 'python')

发布于 2021-04-15 22:53:52
您可以使用
rx_lbr = r'[\r\n\x0B\x0C\u0085\u2028\u2029]+'
with open(filepath, 'r', newline="\n", encoding="utf-8") as fr:
with open(savefilepath, 'w', newline="\n", encoding="utf-8") as fw:
fw.write( re.sub(r'"[^"]*"', lambda x: re.sub(rx_lbr, '', x.group()), fr.read()) )带有re.sub的Unicode正则表达式匹配单引号中所有不重叠的子字符串,而lambda x: re.sub(rx_lbr, '', x.group())替换只从匹配中删除所有垂直空格"[^"]*"字符。因此,所有其他换行符都保持不变。
请参阅Python demo
import re
content = r"""3||@@##14||@@##"2016-01-13 19:59:27"||@@##"2016-01-15 23:09:19"||@@##1162||@@##822||@@##1237||@@##\N||@@##"VHiujdfYshv"||@@##"---
...
"||@@##\N||@@##"2016-01-15 23:09:18"||@@##0||@@##1||@@##0||@@##0||@@##3||@@##1788||@@##\N||@@##205||@@##\N||@@##0||@@##\N||@@##\N||@@##\N||@@##\N||@@##\N||@@##\N||@@##1||@@##\N||@@##"251 Bgegf BHVcvytd Street
JHbsdbfh, RF 35214
xyz@gmail.dhg.com
@@##1788
4||@@##14||@@##"2016-01-25 22:08:53"||@@##"2016-02-15 20:32:08"||@@##1097||@@##933||@@##1262||@@##\N||@@##"VHiujdfYshv"||@@##"---
"""
print( re.sub(r'"[^"]*"', lambda x: re.sub(r'[\r\n\x0B\x0C\u0085\u2028\u2029]+', '', x.group()), content) )https://stackoverflow.com/questions/67063915
复制相似问题