PostgreSQL导入文本文件

时间:2015-11-04 15:25:08

标签: sql bash postgresql

我创建了一个PostgreSQL数据库和表,我希望使用文本文件将数据导入数据库。

我的数据示例:

jameson aa
david bb
piter cc
mat dd
rob ee

此bash可以导入文件,但对于长文件来说速度很慢:

#!/bin/sh
sed 's/ /\',\'/g' file > My_file
while read line; do
psql -d My_db -c "insert into My_table values('$line')"
done < My_file

我也读过这个决心,但是这个导入只是第一个字段中的第一行&amp;不使用分隔符

testdb=> \set content '''' `cat my_file.txt` ''''
testdb=> INSERT INTO my_table VALUES (:content);

1 个答案:

答案 0 :(得分:0)

使用\copy命令。此命令用于从文件导入数据。

\copy my_table from my_file.txt DELIMITER ' '

这很简单,但Postgres非常严格 - 它最后不需要空行,而且字段之间只有一个空格。

注意:您的数据不一致 - 第一行包含字段之间的双倍空格。

回到你的例子。它一定很慢。你确实每一行导入 - 你开始psql和事务的每一行。使用管道和单个事务选项应该快得多。使用awk,您可以生成SQL脚本:

cat my_file.txt | \
awk -F" " -v  Q="'" '{print "INSERT INTO my_table VALUES(" Q$1Q " , " Q$2Q ");" }' | \
psql postgres -1

但是数据中存在丢失转义撇号的风险(与慢速解决方案一样安全)。基于COPY的解决方案应该更好,100%安全。它强制执行所有必要的内部转义。

testdb=> \set content '''' `cat my_file.txt` ''''
testdb=> INSERT INTO my_table VALUES (:content);

这应该不起作用。 psql中的SQL语句不支持对数组的批量操作(如ODBC)。您的示例的结果只是无效的INSERT命令。会话变量被评估为字符串替换。您将语句发送到服务器,如:

INSERT INTO my_table VALUES ('Jameson','aa',
'david','bb',
'pitter','cc'
... )

这是无效的。