5

我正在使用复制命令将带有标题的制表符分隔文件的内容复制到 postgres 中的表中。我以前使用过副本,所以我知道它是如何工作的,但是我有一个关于如何解决文件中丢失的数据的问题。

我已经预先制作了表格,使其具有与标题中的值相同的列名。

我收到的文件中的一些“列”只是空白。我放了假数据只是为了让命令正常工作,但这是每周都会自动化的东西。我想知道我是否只需要告诉人们确保他们的数据是正确的,或者是否有办法告诉复制命令输入一个 NULL 来代替空白数据。

我想我可能不得不放置在空白标签中,这将作为一个空值,但我不确定这是否是最好的做法。

4

1 回答 1

5

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你可以 cat 你的文件。使用所需的任何操作。 注意:我在 OSX 上,所以sed语法可能因您而异。

此外,在当前的 PostgreSQL CommitFest 中,有一个补丁可以将通用的前置和后置处理器添加到COPY命令中。在这里你可以找到整个讨论。

于 2013-01-28T20:33:36.547 回答