我正在使用一个复制命令将带有标题的制表符分隔文件的内容复制到 postgres 中的一个表中。我以前使用过副本,所以我知道它是如何工作的,但我对如何解决文件中丢失的某些数据有疑问。
我已将表格预制为与标题中的值具有相同的列名。
我收到的文件中的一些“列”只是空白。我放入了假数据只是为了让命令正常工作,但这是每周都会自动执行的操作。我想知道我是否只需要告诉人们确保他们的数据正确,或者是否有办法告诉复制命令在空白数据的位置输入 NULL。
我想我可能必须放在空白标签中,这会充当空值,但我不确定这是否是最好的做法。
最佳答案
Documentation for COPY
指定 NULL
的默认值为 \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 中有 a patch将通用预处理器和后处理器添加到 COPY
命令。 Here你可以找到整个讨论。
关于postgresql - 在 Postgres 中从制表符分隔文件复制到表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14567364/