zoukankan      html  css  js  c++  java
  • 用python合并N个不同字符集编码的sql文件的实践

    背景:我有一项工作任务是将svn某文件夹日常更新的sql文件(归类到日期命名的文件夹中)拿到数据库中运行。

    一開始,我是先把sql文件update下来,用notepad++打开,拷贝每个文本的sql语句。放到plsql中运行。尽管如今仅仅有几个。我手动运行没有问题,可是我想以后有一天sql文件有几十或者上百呢...

    我办公用的电脑是win10,cmd下的我想到了用copy *.sql > all.sql,如此合并之后all.sql有中文乱码,后来问同事才知道那个SVN文件夹下是开发提交的sql脚本。有gbk、utf8、gb2312等各种格式,已无力吐槽(涉及到公司的内容。图就不贴了)。

    然后我就上网各种查cmd下是否有字符集转换的命令,网友给我说了这个win_iconv,可是在linux下iconv也要知道原字符集才干转啊。

    于是,我觉定要动手搞下python了,一边上网查一遍自己尝试,这是终于版本号:

    mergeSql.py

    # -*- coding: gbk -*-
    '''
    说明:
        1、2015/10/28,这个版本号已经可以成功使用,仅仅能处理当前目录下的sql文件(子目录忽略)
    '''
    import os
    import sys
    import chardet
    
    
    reload(sys)
    sys.setdefaultencoding("gbk")
    fType_input = sys.argv[1]
    fileName_output = sys.argv[2]
    path_input = sys.argv[3]
    
    
    def mergeSql(fdir, fType, outfile):
        if os.path.exists(outfile):
            os.remove(outfile)
        file_to_write = file(outfile, 'w')
        file_list = os.listdir(fdir)
        for f in file_list:
            if str(f).split(".")[-1] == fType:
                if os.path.isfile(os.path.join(fdir, str(f).decode('gbk'))):
                    file_to_read = file(os.path.join(fdir, str(f).decode('gbk')), 'r')
                file_to_write.write('
    /*----'+str(f).decode('gbk')+'----*/
    ')
                print 'merge...'+str(f).decode('gbk')
    
    
                while 1:
                    line = file_to_read.readline()
                    encoding = chardet.detect(line)['encoding']
                    if len(line) == 0:
                        break
                    else:
                        if encoding in ['ISO-8859-2', 'windows-1252', 'GB2312']:
                            file_to_write.write(line.encode("gbk"))
                            continue
                        file_to_write.write(line.decode(encoding).encode("gbk"))
                file_to_read.close()
        file_to_write.write('
    exit;')
        file_to_write.close()
    
    
    if __name__ == '__main__':
        mergeSql(path_input, fType_input, fileName_output)
    
     当然,还得先安装第三方模块。pip install chardet。


    上一个版本号还是蛮土的,长这样:

    line = file_to_read.readline()
    encoding = chardet.detect(line)['encoding']
    if encoding == 'ascii':
        line = line.decode('ascii').encode('utf-8')
    elif encoding == 'utf-8':
        pass
    elif encoding == 'GB2312':
        line = line.decode('GB2312').encode('utf-8')
    这样子不好,就仅仅能处理三种字符集;不要问我为什么不直接转换为gbk,我也不知道为什么,直接转报错了,先统一转换为utf-8再转换为gbk是ok的!


    最后。要结合sqlplus才干一键运行:

    run.bat

    set dateT=2015-10-27
    python mergeSql.py sql %dateT%.sql %dateT%
    sqlplus TEST/TEST@10-10-0-60-qgtgwsbs @%dateT%.sql > %dateT%.log
    pause


    mergeSql.py 要传两个參数。python mergeSql.py arg1 args2

    arg1是处理的文件名称后缀,arg2是合并生成的文件(脚本执行时,假设这个文件存在则删除)。

    另:转为gbk是由于sqlplus和cmd的编码字符集都是gbk,假设是其它字符集则cmd窗体看到的是中文乱码。


    如今这项工作就变成先update。之后双击下run.bat,最后看下运行日志log完事。

  • 相关阅读:
    HDU4477 Cut the rope II 递推
    HDU4571 Travel in time 动态规划
    在VS2010中使用$err,hr快速查看当前GetLastError()的值
    对C语言的volatile关键字的理解
    三星S6D1121主控彩屏(240*320*18bit,262K)图形设备接口(GDI)实现
    C语言创建二叉树数据结构, 以及各种遍历
    Ubuntu下使用Dr.com宽带客户端上网的步骤
    8051单片机学习笔记/概要/总结/备忘
    联想笔记本电脑Ubuntu系统下触摸板的锁定
    [MSP430] 集成开发环境 IAR Embedded Workbench for MSP430 5.50
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7354973.html
Copyright © 2011-2022 走看看