postgresql - 在 Postgres 中从制表符分隔文件复制到表

标签 postgresql copy csv

我正在使用一个复制命令将带有标题的制表符分隔文件的内容复制到 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/

相关文章:

json - postgresql 未定义的 json 字段未按预期返回 null

recursion - 在DOS中递归复制匹配通配符组合但不创建目录树的文件

C++ 提取 istream 的内容并复制到另一个

MySQL 使用逗号分隔值链接两个表

python - 标记化数据时出错。 C 错误 : EOF following escape character

postgresql - 使用 pg_dump 设置 sslmode=allow

postgresql - 使用数组参数调用存储过程的 ECPG

javascript:在函数(){}中使用当前的for循环计数器值?

Ruby:如何生成具有 Excel 友好编码的 CSV 文件

sql - 消除多个条件并减少到一个(没有 OR 语句)