用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('\r\n/*----'+str(f).decode('gbk')+'----*/\r\n')
            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('\r\nexit;')
    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完事!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值