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-*-
#AuthorAnJia(anjia0532@gmail.comhttps://anjia0532.github.io)
importargparse
importsys,os
importio
reload(sys)
sys.setdefaultencoding('utf8')
black_dict={"\\":"","\"":""}
defmain():
parser=argparse.ArgumentParser()
parser.add_argument('--cols',type=int,dest='cols',action='store',default=-1,help="countofcolumns,defaultfirstline'scells")
parser.add_argument('--src',type=str,dest='src',action='store',default='',
help='pathtosourcecsvfile')
parser.add_argument('--dest',type=str,dest='dest',action='store',default='',
help='pathtodestcsvfile')
parser.add_argument('--encoding',type=str,dest='encoding',action='store',default='utf-8',
help='fileencoding,defaultutf-8')
parser.add_argument('--chunksize',type=int,dest='chunksize',action='store',default='10000',
help='batchlinestowritedestfile,default10000')
parser.add_argument('--delimiter',type=str,dest='delimiter',action='store',default=',',
help='csvdelimiter,default,')
args=parser.parse_args()
cols=args.cols
src=args.src
dest=args.dest
encoding=args.encoding
chunksize=args.chunksize
delimiter=args.delimiter
ifnot(srcanddest)orchunksize<=0:
print("invaildargs!")
sys.exit(-1)
olds=[]
lines=[]
withio.open(src,encoding=encoding)asfp:
forlineinfp.readlines():
line=line.strip()
fork,vinblack_dict.items():
ifkinline:
line=line.replace(k,v)
cells=line.split(delimiter)
ifcols==-1:
cols=len(cells)
if(len(cells)0andlen(olds)=cols:
cells=olds
olds=[]
ifnotolds:
lines.append(delimiter.join(cells[0:cols])+"\n")
iflen(lines)%chunksize==0:
write_to_file(dest=dest,lines=lines)
lines=[]
write_to_file(dest=dest,lines=lines)
defwrite_to_file(dest,lines=[],encoding='utf-8'):
p=os.path.split(dest)[0]
ifnotos.path.exists(p):
os.makedirs(p)
withio.open(file=dest,mode="a+",encoding=encoding)asfp:
fp.writelines(lines)
if__name__=='__main__':
main()
使用方式
pythonclean_csv.py--src=src.csv--dest=dest.csv--chunksize=50000--cols--encoding=utf-8--delimiter=,
总结
以上所述是小编给大家介绍的csv文件容错处理方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!