csv文件容错处理方法
如果数据库有特殊字符(换行符,转义符),会导致生成的csv无法正常导入。
val1,val2,val3 aa,bb,cc a a,bb,cc aa ,bb,cc aa, bb,cc a\a,bb,cc
第一行header和第二行数据正常。
第三行第一个列有换行符,此时导致第四行看着正常(3列),但是数据又是错误的。
第五行跟第三行类似
第七行实际是第二个单元格首字符换行,导致第八行缺失一列。
第九行有转义符
处理成
val1,val2,val3 aa,bb,cc aa,bb,cc aa,bb,cc aa,bb,cc aa,bb,cc
利用空闲时间,用python写了个修补工具,原理是利用,csv是从上往下读的,如果前一行列数不够,一定可以从后一列补上。但是可能存在补完后超过指定列(比如列内包含分隔符,导致数据库3列,变成4列),所以需要对其切片,只保留指定列数。
clean_csv.py
# -*- coding: utf-8 -*-
# Author AnJia(anjia0532@gmail.com https://anjia0532.github.io)
import argparse
import sys, os
import io
reload(sys)
sys.setdefaultencoding('utf8')
black_dict={"\\":"","\"":""}
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--cols', type=int, dest='cols', action='store', default=-1,help="count of columns,default first line's cells")
parser.add_argument('--src', type=str, dest='src', action='store', default='',
help='path to source csv file')
parser.add_argument('--dest', type=str, dest='dest', action='store', default='',
help='path to dest csv file')
parser.add_argument('--encoding', type=str, dest='encoding', action='store', default='utf-8',
help='file encoding,default utf-8')
parser.add_argument('--chunksize', type=int, dest='chunksize', action='store', default='10000',
help='batch lines to write dest file,default 10000')
parser.add_argument('--delimiter', type=str, dest='delimiter', action='store', default=',',
help='csv delimiter,default ,')
args = parser.parse_args()
cols = args.cols
src = args.src
dest = args.dest
encoding = args.encoding
chunksize = args.chunksize
delimiter = args.delimiter
if not (src and dest) or chunksize <= 0:
print("invaild args!")
sys.exit(-1)
olds=[]
lines=[]
with io.open(src,encoding=encoding) as fp:
for line in fp.readlines():
line = line.strip()
for k,v in black_dict.items():
if k in line:
line=line.replace(k,v)
cells = line.split(delimiter)
if cols == -1:
cols=len(cells)
if(len(cells) < cols or (len(olds)>0 and len(olds) < cols)):
if not olds:
olds = cells
else:
cells[0]=olds[-1]+cells[0]
olds.pop()
olds.extend(cells)
if len(olds) >= cols:
cells=olds
olds=[]
if not olds:
lines.append(delimiter.join(cells[0:cols])+"\n")
if len(lines) % chunksize == 0:
write_to_file(dest=dest,lines=lines)
lines=[]
write_to_file(dest=dest,lines=lines)
def write_to_file(dest,lines=[],encoding='utf-8'):
p = os.path.split(dest)[0]
if not os.path.exists(p):
os.makedirs(p)
with io.open(file=dest,mode="a+",encoding=encoding) as fp:
fp.writelines(lines)
if __name__ == '__main__':
main()
使用方式
python clean_csv.py --src=src.csv --dest=dest.csv --chunksize=50000 --cols --encoding=utf-8 --delimiter=,
总结
以上所述是小编给大家介绍的csv文件容错处理方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
相关文章
chatgpt成功解决Access denied 1020错误问题(最新推荐)
从前两天网上开始一直开着的chatgpt网页突然打不开了,提示1020错误,尝试换了不同代理软件或者代理地点仍然无法解决,这篇文章主要介绍了chatgpt成功解决Access denied 1020错误,需要的朋友可以参考下2023-05-05
一文带你快速梳理ChatGPT、GPT4 和OpenAPI的关系
最近最火的几个词无疑是ChatGPT、GPT4 和OpenAPI,那么这三者究竟有什么关系呢,本文将带你进行快速梳理三者的关系,感兴趣的同学可以参考阅读下2023-06-06
VSCode远程XHR failed无法连接的问题及解决方案
VSCode进行远程连接时会检查服务端的Server运行情况,如未运行则需要下载安装,在下载过程中可能需要访问外网,如果外网不通则连接过程失败,解决方法是手动下载离线安装包,手动解压至指定的路径即可,对VSCode远程无法连接问题感兴趣的朋友一起看看吧2024-03-03
浅析mmdetection在windows10系统环境中搭建过程
这篇文章主要介绍了mmdetection在windows10系统环境中搭建过程,本文图文并茂通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2020-01-01


最新评论