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()
时间: 2025-01-10 06:46:00

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

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

刚刚到公司1周便接到了第一个需求,进过了几天的沟通明白了是从gbk文件中恢复InterBase数据库,然后再将恢复到数据库中的数据导出到远程的MySQL数据库中,拿到需求先分步去看问题了,问题大致可分为三步,每一步一个脚本文件,分为三个Python文件来执行. 第一个脚本实现通过命令来实现将“.gbk”的数据库备份文件恢复到“.GDB”格式的数据库文件,命令如下: python restoreWin.py -gbk 备份文件 -gdb 恢复的数据库 第二个脚本实现将InterBase数据库中的数

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

      我拿到的是InterBase导出的".gbk"后缀的数据库备份文件,目标是可以通过命令行的方式导入到指定的数据库中,在这个脚本中我使用了InterBase数据库中自带的"gbak"命令行来进行操作.       首先来介绍一下这个InterBase数据库吧,http://baike.baidu.com/item/interbase?fr=aladdin--百度百科,大致来说就是一种文件数据库了,而由于我在Ubuntu上找不到对应的安装包,所以就拿Inte

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

在这个脚本中我使用的是Python的ORM框架SQLAlchemy来连接远程的MySQL数据库的,在写这个脚本的时候为了方便参数的输入,我就给之前和这个脚本添加了一个新的功能,就是在调用这个脚本的时候后面可以传入参数,这样只需要在执行脚本的时候就可以方便的输入所要使用的路径. 那么现在开始对导出的数据进行解析咯~由于之前已经将列名和数据都写入到了文本文件中, 现在只需要一行一行的读取出来,然后和类中的属性一一对应就可以了,那么现在开始读取资料吧~老样子,先用切片将之前写在文本文件中的第一行列名取

mysql数据导出权限问题

mysql数据导出的方法有非常多,比如mysqldump, mysql -e 'sql' > file, 这些都能够非常方便的导出数据,但是在使用普通用户导出数据的时候,出现了问题. 1 select * into outfile "file_path" from my_table 上面的语句也是mysql导出数据的一种方式,在使用普通用户运行语句时.出现了一下错误: 1 ERROR 1045 (28000): Access denied for user 'my_user'@'

用mapreduce实现将mysql数据导出到HDFS上

因为业务需要,需要将一批mysql数据导入到HBASE,现在先将数据从Mysql导出到HDFS. 版本:hadoop CDH4.5,Hbase-0.946 1.实体类 YqBean 是我的实体类,请根据自己需要修改,实体类需要 implements Writable, DBWritable. 2.MR实现 import java.io.IOException; import java.util.Iterator; import org.apache.hadoop.conf.Configurati

MySQL数据导出与导入

发一篇基础的,关于MySQL数据导出导入的文章,目的有二: 1.备忘 2.供开发人员测试 工具 mysql/source 导入mysqldump 导出 应用举例 导出 导出全库备份到本地的目录 mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines --default-character-set=utf8 --lock-all-tables --add-drop-database -A > db.all.sql 导出指定库到本地的目录(

mysql数据导出到excel以及相关计算

mysql 查询出数据之后, 可以选择导出文件 默认是csv文件  如果是整数类型的数据 可以CONCAT('\'', filed) 多加个'就可以变成文本了, 然后以文本编辑器打开csv文件 把'等字符替换为空字符串. 新建一个excel文件,找到数据-->自文本,选择下一步 格式为文本  确定即可 一些基本的excel函数: 计算某个字符或数字等的个数:=COUNTIF(A:A,"测试") 就是在A列的'测试'这个字符串出现的个数 根据身份证号计算性别:=IF(MOD(MID

MySQL数据导出导入【转】

MySQL基础 关于MySQL数据导出导入的文章,目的有二: 1.备忘 2.供开发人员测试 工具 mysqlmysqldump 应用举例 导出 导出全库备份到本地的目录 mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines --default-character-set=utf8 --lock-all-tables --add-drop-database -A > db.all.sql 导出指定库到本地的目录(例如mysql库) my

MySql 数据导出/导入一些Tips

最近接触MySql比较多,借此记录下一些知识点. Tips: 1.数据导出为.sql文件时,会对单引号 ' 进行转义处理,最终INSERT 语句中的为 \' 2.插入不重复数据(insert if not exist)时,可以用 INSERT IGNORE或者REPLACE INSERT IGNORE:   插入重复则失败,但会忽略,继续执行下一条. REPLACE:    插入重复会直接覆盖,没有则新增. 以上两条均会导致自增ID不连续问题,INSERT失败会自增,REPLACE是先删除后IN