• 将文本数据(txt/cvs)导入PostgreSQL数据库步骤

    作者:  • 2009 年 12 月 27 日 • 技术主义 • 2 条评论

    前几天麻烦陈松把CBDB所有的数据打包给我一份,说起来还挺麻烦陈松的,他要通过Sophia联系项目支持方的一家台湾公司发给我才行。没用一个礼拜陈松就把所有的数据发给我了,不过数据只是utf8格式的文本数据,没有数据之间的关系,不过在CBDB的官方网站上可以下载2009年3月版本的access版本数据库,这个数据库一直是由CBDB委员会维护的,主要数据来自于王德毅教授的《宋人传记资料索引》(全书一共有六册)。再说这份数据,每个表分别为一份文本数据文件,下图即为Office_codes.txt 数据节选。

    最开始拿到这份数据的时候,想到了很多导入数据库的方法,只要一个数据库支持csv数据导入,其实就应该没有什么问题。比如,用SqLite Manager可以导入到SpatiaLite中,这样如果今后要做服务器端开发,或者桌面应用,Spatialite也是不错的选择。或者用Access 2007导入到Access数据库中,Microsoft把Access 2007做的实在很fancy,而且功能也是很不错的,只是Robbins的操作栏不太习惯而已。但是我还是遇到了一个大问题,PostgreSQL并没有很好的CVS导入的GUI操作软件。所以,我就想,因为PostgreSQL也是支持OBDC的,其实,所以可以用OBDC做为一个中转站,先将数据导入Access,然后通过OBDC导入到PostgreSQL中。关于OBDC的PostgreSQL接口,需要下载psqlodbc。

    插句题外话,SpatiaLite是个不错的数据库,他是一个意大利小伙基于Sqlite和GEOS、GDAL、Proj4等开源地理插件做的空间数据库。如果想用Django做为后台,SqLite是native支持的,所以用SpatiaLite也个好的选择,我记得以前写过一篇介绍SqLite和SpatiaLite的文章。大家可以在我的网站上搜索到。我没有用spatialite一个主要原因是我希望利用postgreSQL进行全文搜索,如果用spatialite,就不方便做到这一点。

    好,接着是将数据到导入到Access的大致步骤,这个过程还是相当handy的:

    1. 新建数据库

    1. 选择 文本数据导入

    3.打开要导入的文本数据

    4.主要选择数据编码为utf8, 用制表符做为分隔符,并且第一行为标题行

    5.除了以上的注意事项,基本上就可以默认生成表了。

    注意,在转换过程中会遇到很多问题,Access会为我们建立错误索引,所以很容易就可以对数据进行修改,但是我暂时不建议大家修改Access数据库,我建议大家等导入到PostgreSQL只有在根据错误的索引对错误加以修改。

    6. 导入PostgreSQL数据库也不难,为了让数据库以后支持空间数据,首先要建立一个空间数据库。最方便的就是复制一个空间数据库模板template_postgis。注意字符编码一定要选择UTF8.因为古汉语的单字很多普通的字库都无法识别。

    7.在Access里面,选择外部数据àOBDC数据库

    8. 选择需要导入的数据库

    发现有些错误是由于access默认导入造成的,所以我用sqlite版本的数据输出csv,然后再次导入到access数据就没有出现类似的问题,然后再通过ODBC导入到PostgreSQL数据库中。

    9. 根据原始的CBDB数据的关系确定PostgreSQL各个表的主键以及外键。

    关于

    生于古城長安,求學金陵,輾轉赴美深造,現漂泊於長安與北京。

    http://www.yenching.org