将CSV文件导入PostgreSQL时忽略引号?

时间:2011-09-11 04:36:36

标签: postgresql

我正在尝试将制表符分隔的文件导入我的PostgreSQL数据库。我文件中的一个字段是“标题”字段,偶尔包含实际引号。例如,我的tsv可能看起来像:

id    title
5     Hello/Bleah" Foo

(是的,标题中只有一个引号。)

当我尝试将文件导入我的数据库时:

copy articles from 'articles.tsv' with delimiter E'\t' csv header;

我收到此错误,引用该行:

ERROR:  unterminated CSV quoted field

我该如何解决这个问题?引号永远不会用于包围文件中的整个字段。我试过了copy articles from 'articles.tsv' with delimiter E'\t' escape E'\\' csv header;,但我在同一行上得到了同样的错误。

3 个答案:

答案 0 :(得分:7)

假设文件实际上从未尝试引用其字段:

您想要的选项是“带引号”,请参阅http://www.postgresql.org/docs/8.2/static/sql-copy.html

不幸的是,我不确定如何完全关闭引用处理,一个kludge将指定一个根本没有出现在你的文件中的字符。

答案 1 :(得分:6)

分隔的选项卡是复制语句的默认格式。将它们视为CSV非常愚蠢。 (您是否只是跳过标题?)

copy articles from 'articles.tsv';

完全符合您的要求。

答案 2 :(得分:1)

我为同样的错误而苦苦挣扎。最后,从几个SO问题中收集了知识,我想到了以下设置,即使对于非常复杂的JSON列,也可以使COPY TO / FROM成功:

QUOTE '\b'

最重要的部分:

  • DELIMITER E'\t'-用退格键报价(非常感谢@grautur!)
  • ESCAPE '\'-带制表符的定界符
  • h is not a constructor-并使用反斜杠