csv文件容錯處理方法
如果數(shù)據(jù)庫有特殊字符(換行符,轉(zhuǎn)義符),會導(dǎo)致生成的csv無法正常導(dǎo)入。
val1,val2,val3 aa,bb,cc a a,bb,cc aa ,bb,cc aa, bb,cc a\a,bb,cc
第一行header和第二行數(shù)據(jù)正常。
第三行第一個列有換行符,此時導(dǎo)致第四行看著正常(3列),但是數(shù)據(jù)又是錯誤的。
第五行跟第三行類似
第七行實際是第二個單元格首字符換行,導(dǎo)致第八行缺失一列。
第九行有轉(zhuǎn)義符
處理成
val1,val2,val3 aa,bb,cc aa,bb,cc aa,bb,cc aa,bb,cc aa,bb,cc
利用空閑時間,用python寫了個修補工具,原理是利用,csv是從上往下讀的,如果前一行列數(shù)不夠,一定可以從后一列補上。但是可能存在補完后超過指定列(比如列內(nèi)包含分隔符,導(dǎo)致數(shù)據(jù)庫3列,變成4列),所以需要對其切片,只保留指定列數(shù)。
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=,
總結(jié)
以上所述是小編給大家介紹的csv文件容錯處理方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
通過lms.samples熟悉lms微服務(wù)框架的使用詳解
這篇文章主要介紹了通過lms.samples熟悉lms微服務(wù)框架的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04eBay 打造基于 Apache Druid 的大數(shù)據(jù)實時監(jiān)控系統(tǒng)
Apache Druid 是一個用于大數(shù)據(jù)實時查詢和分析的高容錯、高性能開源分布式時序數(shù)據(jù)庫系統(tǒng),旨在快速處理大規(guī)模的數(shù)據(jù),并能夠?qū)崿F(xiàn)快速查詢和分析。這篇文章主要介紹了eBay 如何打造基于 Apache Druid 的大數(shù)據(jù)實時監(jiān)控系統(tǒng)?需要的朋友可以參考下2019-06-06