环境 : python 2.7
之前写过一版 MySql 与 Oracle数据互导的小工具代码,不过是基于持续连接 两边的数据库的,而且受网速限制比较大,于是直接从备份文件导入到目标数据库的想法就出现了。
不过由于考虑问题比较大意,此过程中经常对字符串的处理 修修补补。
好在经过N次的测试及使用,暂时对于手头的数据处理是够用了。
好了,废话不多说了,以下是 对MySQL dump出来的文件字符串处理过程中的几个核心方法
其他的字符串处理 大同小异,有兴趣或者需要的 童鞋可以交流探讨下
##coding=utf-8 import sys reload(sys) sys.setdefaultencoding('utf8') def enEstr(t):#对于MySql 导出数据字段值中的 某些转义字符 做预处理 t = t.replace(u'\\\\',u'AJeenA') t = t.replace(u"\\'",u'BJeenB') t = t.replace(u'\\"',u'CJeenC') return t def deEstr(t):#还原 Mysql 中 转义字符 为 Oracle 中 对应可用的 if get_type(t) in ['str','unicode']: t = t.replace(u'AJeenA',u'\\') t = t.replace(u'BJeenB',u"'") t = t.replace(u'CJeenC',u'"') return t def dlsTostrlist(t): temp = [] #括号及单引号配对 fa = [] #最终返回值 data = [] # 暂存 fa 中的元素 for i in xrange(len(t)): c = t[i] if len(temp) == 0: if len(data) > 0: fa.append(''.join(data)) data = [] elif i == len(t) - 1: if c == u')' and len(temp) > 0 and temp[-1] == u'(': data.append(c) fa.append(''.join(data)) data = [] if c == u'(' : if len(temp) == 0: temp.append(c) elif temp[-1] == u'(': temp.append(c) data.append(c) continue elif c == u"'" : if len(temp) > 0 : if temp[-1] == "'": temp.pop() else: temp.append(c) data.append(c) continue elif c == u')' : if len(temp) > 0 : if temp[-1] == u'(': temp.pop() data.append(c) continue elif c == u',' and len(temp) == 0: continue else: data.append(c) del temp,data return fa def strTolist(t): t = t[1:-1] #剔除前后的括号 ds = t.split(u',') # 按 , 进行分割 fa = [] #存储返回值 data = [] #缓存 如'a,bb,ccc'分割后的 过程值 ["'a","bb","ccc"] temp = u'' # 用于判断data 是否已符合拼接要求 for d in ds: if d.startswith(u"'") and d.endswith(u"'") and len(d) > 1: #完整的值 至少为 '' 空串,排除 '',',abcd' 分割后的异常情况 fa.append(d[1:-1]) #剔除前后的 单引号 elif d == u'NULL' : #空值 fa.append(u'') elif d.isdigit() and len(data) == 0: #由数字组成 且不是 形如 'aa,2345,bbcc' 分割后的过程值 '2345' fa.append(int(d)) else: #需要拼接的值 元素 data.append(d) temp = u','.join(data) if temp.startswith(u"'") and temp.endswith(u"'") and len(temp) > 1: #符合拼接要求 fa.append(temp[1:-1]) #剔除前后的 单引号 data = [] del temp,data,ds return fa s = u"(1,'2013-12-10 15:06:21','Tcom_id',NULL,'tiBJeenBmCJeenCa)ge','ti,543,m)()aBJeenBg,e_src'),(2,'2013-12-10 15:11:09','Tcom_id','Tp_id','\u963f\u65af\u8482\u82ac','\u963f\u8428\u5fb7\u2019BJeenB')" ''' 此需求,由 MySql dump 生成的文件 导入到 Oracle 的过程中产生 将形如 s 的 unicode 字符串 转化成 形如: [ u"(1,'2013-12-10 15:06:21','Tcom_id',NULL,'tiBJeenBmCJeenCa)ge','ti,543,m)()aBJeenBg,e_src')", u"(2,'2013-12-10 15:11:09','Tcom_id','Tp_id','\u963f\u65af\u8482\u82ac','\u963f\u8428\u5fb7\u2019BJeenB')" ] 的 unicode 字符串数组 再将 所得到 数组中的字符串 转化成 形如: [1, u'2013-12-10 15:06:21', u'Tcom_id', u'', u'tiBJeenBmCJeenCa)ge', u'ti,543,m)()aBJeenBge_src'] 的数组 #注意#字串中 不能有转义的 单引号 可在转化前 进行 enEstr() 处理, 得到结果后 在 deEstr() 进行对应的还原 ''' t = dlsTostrlist(s) print t print '\n' l = t[0] print l b = strTolist(l) print b
真是验证了一句话“bug只可能被发现,不可能被消灭”
欢迎 指点 或 拍砖