是否可以使用CSV格式关闭Postgres COPY命令中的报价处理?

Tom*_*Leu 13 csv postgresql import

我有CSV文件,以制表符分隔,字段没有用引号括起来,其中字段数据可以包含单引号,双引号,管道和反斜杠等字符.

示例数据可能如下所示:

1       2       "ba$aR\eR\       18
Run Code Online (Sandbox Code Playgroud)

我想使用COPY语句将此数据导入Postgres.

当我尝试使用导入它时

COPY <tablename> FROM  <filename> NULL AS '';
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,psql:-:1: ERROR: missing data for column因为Postgres将反斜杠+选项卡视为"转义选项卡"而不是反斜杠后跟字段分隔符.

所以我切换到使用COPY运算符的"CSV格式",如下所示:

COPY <tablename> FROM <filename> WITH CSV DELIMITER E'\t' NULL AS '';
Run Code Online (Sandbox Code Playgroud)

现在出现了一个新错误 psql:-:1: ERROR: value too long for type character varying(254)

显然是因为它将字段3开头的双引号解释为字段包装字符.

如何指定我的数据根本没有引用?

Tom*_*Leu 32

解决方法(感谢此评论!)

COPY <tablename> FROM <filename> WITH CSV DELIMITER E'\t' QUOTE E'\b' NULL AS '';
Run Code Online (Sandbox Code Playgroud)

所以基本上指定一个永远不应该出现在文本中的引号字符,但这非常难看.

如果实际上有一种方法可以完全关闭报价处理,我会更喜欢它.

  • @Kyle Barron 的添加对于一些编码错误的文本至关重要。我有一个非常大(~50GB)的 CSV,我需要复制它,在结束之前大约有 3GB,出现“\b”。该文件的源在清理值方面做得很糟糕,但这并不意味着我希望我的“COPY”失败。`tr` 来救援。 (2认同)

Kyl*_*ron 7

(添加为新答案,因为我还没有评论的声誉。)

作为记录,由于我一直在为同样的问题而苦苦挣扎,因此您可以使用tr删除\b,而不仅仅是希望它不在您的文本中的任何地方。

tr -d '\010' < filename.csv > newfile.csv
Run Code Online (Sandbox Code Playgroud)

(使用\010的是八进制表示\b)。

由于COPY支持从 读取STDIN,您可以通过管道tr输出来减轻 I/O 影响:

cat filename.csv | tr -d '\010' | COPY <tablename> FROM STDIN WITH CSV DELIMITER E'\t' QUOTE E'\b' NULL AS '';
Run Code Online (Sandbox Code Playgroud)