处理一个csv文件,每次用文本编辑器打开,是某行。换成WPS打开总少几百行。
人工定位了一下异常的数据:
2020/07/03 00:43:24,SikorskyFlights,"Linsk Minyk“ Sikorsky
2020/07/03 00:43:26,wendy_marchese,Wendy Marchese
2020/07/03 00:43:26,Smartkr13564931,smart_Krish
2020/07/03 00:43:26,ChiTsz1,ChiTsz1,
2020/07/03 00:43:26,TBeansprout,TONYA {K}🌸
原来,"Linsk Minyk“ 用了英文引号开头,中文引号结尾。WPS遇到引号开头,默认为文本,但是迟迟找不到结束的引号,因此“吸收”了后面的所有行!
看下图,开头的英文引号不会出现在单元格内,被默认为文本的开始符。
解决方案:
(最差选择)把所有引号替换为 单引号、中文引号、反斜杠+引号,都可以解决这个问题。但是会破坏原有成分。
2020/07/03 00:43:24,SikorskyFlights,\"Linsk Minyk“ Sikorsky
2020/07/03 00:43:26,wendy_marchese,Wendy Marchese
2020/07/03 00:43:26,Smartkr13564931,smart_Krish
2020/07/03 00:43:26,ChiTsz1,ChiTsz1,
2020/07/03 00:43:26,TBeansprout,TONYA {K}🌸
(最优选择)把异常的文本列,前后都加上引号。
def filter_text(text):
text = text.strip().replace("\\", "/").replace("\r", " ").replace("\n", ".")
if text.startswith("\""):
text = "\"" + text + "\""
re_tag = re.compile('</?\w+[^>]*>') # 去掉HTML标签
new_text = re.sub(re_tag, '', text)
new_text = re.sub(" +", " ", new_text) # 合并空格
new_text = re.sub("\t", " ", new_text) # 去掉tab
return new_text
如果把所有文本列都加上引号,文本内部的逗号就不会被误认为是列分隔符。
这样做有个问题:用python代码读取CSV时,就不能简单使用 line.strip().split(",") 进行列分隔了,而是要进行文件解析。
所以,我在生成csv文件的时候用”\t“做分隔符。然后把所有英文逗号批量替换为句号或分号。然后再把\t批量替换为逗号。
这样极其省事!
但是如果是正规的商业数据挖掘,还是老老实实解析文件吧。
来源:oschina
链接:https://my.oschina.net/u/4411637/blog/4458965