这篇我将记叙我的第二个脚本程序,这篇我使用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()

InterBase数据库迁移到MySQL(数据导出)的更多相关文章

  1. InterBase数据库迁移到MySQL(说明)

    刚刚到公司1周便接到了第一个需求,进过了几天的沟通明白了是从gbk文件中恢复InterBase数据库,然后再将恢复到数据库中的数据导出到远程的MySQL数据库中,拿到需求先分步去看问题了,问题大致可分 ...

  2. InterBase数据库迁移到MySQL(恢复备份)

    我拿到的是InterBase导出的“.gbk”后缀的数据库备份文件,目标是可以通过命令行的方式导入到指定的数据库中,在这个脚本中我使用了InterBase数据库中自带的“gbak”命令行来进行操作. ...

  3. InterBase数据库迁移到MySQL(数据导入)

    在这个脚本中我使用的是Python的ORM框架SQLAlchemy来连接远程的MySQL数据库的,在写这个脚本的时候为了方便参数的输入,我就给之前和这个脚本添加了一个新的功能,就是在调用这个脚本的时候 ...

  4. mysql数据导出权限问题

    mysql数据导出的方法有非常多,比如mysqldump, mysql -e 'sql' > file, 这些都能够非常方便的导出数据,但是在使用普通用户导出数据的时候,出现了问题. 1 sel ...

  5. [转载]如何将OFBIZ(opentaps)默认数据库迁移至mysql((2

    原文地址:如何将OFBIZ(opentaps)默认数据库迁移至mysql(利昂原创)作者:利昂 ofbiz自带的数据库是Derby,这是一种小型的适合与测试系统的数据库,但不适合在产品级系统中使用,所 ...

  6. Oracle 数据库迁移到MySQL (kettle,navicate,sql developer等工具

    Oracle 数据库迁移到MySQL (kettle,navicate,sql developer等工具 1 kettle --第一次使用kettle玩迁移,有什么不足之处和建议,请大家指正和建议. ...

  7. 从其他数据库迁移到MySQL及MySQL特点

    从其他数据库迁移到MySQL Oracle,SQL Server迁移到MySQL 一些变化 不再使用存储过程.视图.定时作业 表结构变更,如采用自增id做主键,以及其他语法变更 业务SQL改造,不使用 ...

  8. MySQL数据导出导入【转】

    MySQL基础 关于MySQL数据导出导入的文章,目的有二: 1.备忘 2.供开发人员测试 工具 mysqlmysqldump 应用举例 导出 导出全库备份到本地的目录 mysqldump -u$US ...

  9. mysql 数据导出 常用总结

    mysqldump -t 数据库名 -uroot -p > xxx.sql 总结:上面的导出形式默认表结构和数据: -d表结构; -t数据;   -c, --complete-insert使用完 ...

随机推荐

  1. .NET生成带Logo的二维码

    使用ThoughtWorks.QRCode生成,利用这个库来生成带Logo的二维码(就是中间嵌了一个图片的二维码),直接见代码: HttpContext context = HttpContext.C ...

  2. Delphi编译dll时出错"Cannot debug project unless a host application is defined.use the run|parameters...dialog box."

    问题: 在编写DLL程序的时候,按下F9或者按下那个绿色的箭头,会报错,如下 原因: 是因为你按下的F9或者那个绿色箭头是表示“Run”这个程序,但是DLL不是可执行文件,所以当然不能够运行,所以就会 ...

  3. 突破python缺陷,实现几种自定义线程池 以及进程、线程、协程的介绍

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...

  4. 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)

    Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...

  5. hdu 5291 dp+优化 ****

    多校实在高能 题解链接 题意:有n中糖果,每种糖果有ai个.分给A,B两个人.两人的糖果要一样多,可以都是0,1......m个.同一种糖果没有区别. 问有几种分法. 定义dp[i]表示两人之间相差i ...

  6. hdu 4412 2012杭州赛区网络赛 期望

    虽然dp方程很好写,就是这个期望不知道怎么求,昨晚的BC也是 题目问题抽象之后为:在一个x坐标轴上有N个点,每个点上有一个概率值,可以修M个工作站, 求怎样安排这M个工作站的位置,使得这N个点都走到工 ...

  7. hdu 4046 2011北京赛区网络赛G 线段树 ***

    还带这么做的,卧槽,15分钟就被A了的题,居然没搞出来 若某位是1,则前两个为wb,这位就是w #include<cstdio> #include<cstring> #defi ...

  8. linux下搭建属于自己的博客(WordPress安装)

    转自:http://www.cnblogs.com/xiaofengkang/archive/2011/11/16/2251608.html WordPress简介 WordPress 是一种使用 P ...

  9. 怎么提高Jquery性能

    很久没有关注jQuery了,最近重新看了一下,看到一些不错的文章,转来坐一下笔记. 其内容和一些新提供的方法还是很多有值得学习的地方. 1. 使用最新版本的jQuery jQuery的版本更新很快,你 ...

  10. 转:delphi异常捕获try except语句 和 try finally语句用法

    转:http://www.java123.net/v/936977.html      2015-06-24 09:27:48 一直写程序都没管他们,也尽量很少用,今天终于想把他给弄个明白,在网上找来 ...