[转载]导入文本文件中的数据到PostgreSQL中
作者: falcon 来源:http://oss.lzu.edu.cn/blog/article.php?tid_1265.html说明:下面的操作在gentoo上完成,关于postgreSQL的基本使用请参考资料
上次在《用AWK转换树形数据成关系表》中提到可以通过AWK把以“树形”方式存放的数据转换成关系表,这里将介绍如何把这个表从文本文件中直接导入到PostgreSQL数据库管理系统中。
如果用过mysql,你会发现它提供了一个非常有用的load命令来导入文本文件中存放的数据,强大的PostgreSQL也提供了类似的工具,那就是COPY命令,基本的用法是:
Quote:COPY tablename FROM 'filename' WITH DELIMITER ' delimiter'
这里涉及到导入哪个表,从哪里导入,以及原始数据的分割符。这里涉及的核心东西还是原始数据,因为我们需要根据原始数据设计表,指定分割符,然后导入到PostgreSQL中。
首先看看上次的数据(用AWK转换树形数据成关系表),文件名叫db,内容是一个系统函数的部分调用层次.
Quote:1 1 sys_clone
2 2 do_fork
3 3 alloc_pidmap
4 3 copy_process
5 4 dup_task_struct
6 5 prepare_to_copy
7 5 kmem_cache_alloc
8 5 kmem_cache_alloc
9 5 memcpy
10 4 ktime_get_ts
11 5 getnstimeofday
12 6 do_gettimeofday
13 7 get_offset_tsc
14 5 set_normalized_timespec
15 4 audit_alloc
16 4 copy_semundo
17 4 copy_files
18 5 dup_fd
19 6 alloc_files
这个文本文件中有三列数据,分别叫调用顺序,调用层次,函数名,从文本数据中我们看出分割符并不固定,是一个或者多个空格。
下面通过三步把上面的文本数据导入到PostgreSQL中。
首先,设计数据库,叫syscall, 表为tree,表中字段包括调用顺序id,调用层次depth,函数名func。具体创建库和表(在gentoo发行版上):
Quote:$ su postgres
$ createdb syscall
$ psql -d syscall
syscall=# CREATE TABLE "tree" (id bigint, depth bigint, func char(100));
syscall=# \quit
现在我们处理一下上面的文本,把分割符设置成单个空格。
Quote:$ sed -i -e 's/[[:space:]][[:space:]]*/ /g' db
把处理过后的文件存放到某个指定目录下(我把它放在/home/falcon/database/db),然后导入数据库中。
Quote:$ psql -d syscall
syscall=# COPY tree FROM '/home/falcon/database/db' with DELIMITER ' ';
或者
syscall=# \COPY tree FROM '/home/falcon/database/db' with DELIMITER ' '
看看效果:
syscall=# select * from tree limit 10;
注:貌似用COPY命令的时候得指定文本文件的绝对路径,而\copy命令可以用相对路径。集合上篇文章(用AWK转换树形数据成关系表),实际上我们就可以把内核函数跟踪工具KFT的结果存放到数据库中了,相关的工作包括如何处理KFT产生的调用树,如何自动跟踪不同的系统调用等。如果有兴趣届时可以访问我的个人首页。
http://gentoo-wiki.com/HOWTO_Configure_Postgresql
PostgreSQL Usage and Tutorials
http://www.eskimo.com/~ericj/personal/postgresql/
COPY command of psql
http://www.postgresql.org/docs/8.2/static/sql-copy.html
页:
[1]