InterBase数据库迁移到MySQL(数据导出)
这篇我将记叙我的第二个脚本程序,这篇我使用InterBase数据库提供的“isql”命令来导出我所要的数据,但是由于“isql”命令没有直接导出数据的语句,说以我采用的是导入一个配置文件,在这个文件中定义好我要打开的是哪个数据库,以及输入账户名和密码之后使用sql语句查出所要的数据并写入到缓存中。
CONNECT "127.0.0.1:C:\OFFICE.GDB" USER "sysdba" PASSWORD "masterkey"; SELECT *FROM DAILYPLU;
一开始我是打算将数据先导出到文本文件中的,然后再通过第二个程序读取文本文件中的数据,但是后来想想可以讲这个两个程序做成一个的,而且还免去了导出路径以及第二个脚本读取路径的麻烦,于是我便将导出的数据以file类型的变量存在内存中,然后直接对这个变量进行操作,在查看“isql”命令导出的文件格式之后我发现了一个很乱的结果,与我想象的不一样的是,它是先输出一些没有用的话,然后是一行列名,紧接着是一行“===”来隔开列名与数据,然后是20行的内容,紧接着又是一行列名,一行“==”然后循环到数据导完。
对于这样的数据很难通过直接读取来到MySQL数据库中,所要要在脚本中进行处理,这一步很关键,而且也很复杂…我先使用Python的切片将文件切成两部分,这样我就可以从两部分中分别提取出列名,和数据了,对于第一个部分的列名的读取很简单,应为事先知道列名是第三行,这样我就可以通过切片直接取到第三行的数据了,这样切出来的数据是一行字符串,而使用Python中的join函数可以将一个字符串转换成list,这里还用到了scanf模块,切实很好用,有兴趣的可以深入研究一下,对于后面的数据我发现我遇到的数据全部是数字,于是乎偷了个懒,使用正则表达式将后面的内容除了数字的其他内容全部过滤掉,这样最后的数据就只剩下数字和空格了,对于时间的处理,由于数据中的时间是出现在一行的最后一列的,所以我在处理数据的时候将数据再切成两部分,前面的数字一部分,后面的时间单独进行正则的匹配,然后再把这两组数据拼接在一起组成新的数据,这样得到的仍然是一个字符串,同样通过join函数进行转换,最后再把两部分的数据拼装在一起,这样就输出成了第一行是列名,之后的全部是数据了,下面附上2张图片说明格式化之前和之后的样子:
之后将格式化的数据输出到文本文件中,以方便后面脚本的读取,下面是程序:
import os import re,pdb,sys,getopt opts, args = getopt.getopt(sys.argv[1:], "hi:o:",["help","int=","out="]) input_file="" output_file="" def usage(): print """ -h --help print the help -i --int To enter the address configuration file -o --out To export the address database """ for op, value in opts: if op in ("-i","--gbk"): input_file = value elif op in ("-o","--gdb"): output_file = value elif op in ("-h"): usage() sys.exit() #这个是InterBase数据库导出的命令 def main(): #执行isql命令将返回一个文件并保存到一个变量中,然后逐行读取这个变量中的内容 file=os.popen("isql<"+input_file) file3=file lines = file3.readlines() #打开配置文件 fp = open(output_file,'w') #将读取到的数据取出表名,然后再写入到导出的文件的第一行 lines11 = file3.readlines() lines12 = lines11[2:3] for line in lines2: result = scanf.sscanf(line,'%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s') linse3 = ",".join(result) fp.writelines(linse3) #对isql导出的文件进行切片,删除掉没有用的开头 lines2 = lines[5:-1] lines3=[] for line in lines2: #下面的代码使用正则将空格删除,将时间格式化后拼装回成完整的一条数据 line=re.sub(r'[^\d^\s^\-^\:^\.^\n]','',line) time=re.search(r'\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}',line) if time!=None: line=re.sub(r'\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{4}','',line) line=re.sub(r'\s+',' ',line) sp=line.split(' ') sp.append(time.group()) line=','.join(sp) line=re.sub(r'[,]+',',',line) line=line.split(',') line=line[1:] if len(line)!=0: lines3.append(line) else: line=re.sub(r'[^\d^\s^\-^\:^\.^\n]','',line) line=line[1:].strip() #将格式化好的数据逐行的写入到指定的文件中 for line2 in lines3: line2=','.join(line2) fp.writelines(line2) fp.write('\r\n') fp.close() if __name__ == '__main__': main()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?