我正在使用复制命令将带有标题的制表符分隔文件的内容复制到postgres中的表。我之前使用过copy,所以我知道它是如何工作的,但我有一个问题,我怎么能解决文件中缺少的一些数据。
我预先制作了表格,其名称与标题中的值相同。
我收到的文件中的一些“列”只是空白。我已经将假数据放入以使命令正常工作,但这是每周自动化的事情。我想知道我是否只是要告诉人们确保他们的数据是正确的,或者是否有办法告诉复制命令在空白数据的位置输入NULL。
我认为我可能不得不放在空白标签中,这将作为一个空白,但我不确定这是否是最好的行动方案。
答案 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你可以找到整个讨论。