将Postgres中的制表符分隔文件复制到表格中

时间:2013-01-28 17:10:21

标签: postgresql copy tab-delimited

我正在使用复制命令将带有标题的制表符分隔文件的内容复制到postgres中的表。我之前使用过copy,所以我知道它是如何工作的,但我有一个问题,我怎么能解决文件中缺少的一些数据。

我预先制作了表格,其名称与标题中的值相同。

我收到的文件中的一些“列”只是空白。我已经将假数据放入以使命令正常工作,但这是每周自动化的事情。我想知道我是否只是要告诉人们确保他们的数据是正确的,或者是否有办法告诉复制命令在空白数据的位置输入NULL。

我认为我可能不得不放在空白标签中,这将作为一个空白,但我不确定这是否是最好的行动方案。

1 个答案:

答案 0 :(得分:5)

Documentation for COPY指定NULL s的默认值为\N。因此,将其更改为空,如@a_horse_with_no_name建议的那样。

另一种方法是使用任何其他工具预处理文件。我经常在我的脚本中执行以下操作:

psql dbname <<EOSQL
COPY tab FROM stdin WITH (FORMAT 'csv', DELIMITER E'\t', NULL 'NULL');
$(printf "1\t2\t3\n4\t\t6\n7\t8\t\n\t10\t11\n"| \
  sed -e 's/\(\t\|^\)\(\t\|$\)/\1NULL\2/g')
\.
EOSQL

而不是printf你可以捕捉你的文件。使用所需的任何操作。 注意:我使用的是OSX,因此sed语法可能因您而异。

此外,在当前的PostgreSQL CommitFest中,a patch可以将通用的前处理器和后处理器添加到COPY命令中。 Here你可以找到整个讨论。