• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    csv文件容错处理方法
    POST TIME:2021-10-18 09:21

    如果数据库有特殊字符(换行符,转义符),会导致生成的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文件容错处理方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
    如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

    您可能感兴趣的文章:
    • 解决Python中pandas读取*.csv文件出现编码问题
    • python 读取.csv文件数据到数组(矩阵)的实例讲解
    • python的pandas工具包,保存.csv文件时不要表头的实例
    • PHP 实现从数据库导出到.csv文件方法
    上一篇:Hadoop 文件系统命令行基础详解
    下一篇:cnpm不是内部命令的解决方案:配置环境变量【推荐】
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信