带引号的NULL值会导致PostgreSQL COPY命令失败



我有一个大的CSV文件,所有列都用"引用。空值表示为"",列分隔符为|。我想使用postgresql(版本10.7(中的COPY命令来获取这些文件。我尝试过很多组合,但对我来说更自然的是以下几种:

COPY test.large
FROM '/path/to/big.file'
WITH (
FORMAT CSV,
HEADER,
DELIMITER '|',
QUOTE '"',
NULL ''
);

我的基础表需要一个整数列,并且有些行的NULL值设置为...|""|...,而不是某个数字...|"123456"|...。不幸的是,这使得COPY崩溃,称:

ERREUR:  syntaxe en entrée invalide pour l'entier : «  »
CONTEXT:  COPY regpat_pct_app_reg, ligne 2743, colonne appid : «  »

对不起,这是法语的。不管怎样,上面写着:Invalid syntax for integer : « »在2743行,我们发现:

...000205"|""|"XY...

这是一个NULL值,但我找不到如何正确设置COPY命令开关以使postgresql接收这些文件。

文件上写着:

NULL

指定表示空值的字符串。默认值是文本格式的\N(反斜杠-N(,以及CSV格式。对于不想区分null和空字符串的情况。使用二进制格式时不允许使用此选项。

我知道可以通过使用sed或一些regexp/replaces操作将...|""|...更改为...||...来清理文件。这将解决我的问题,我已经检查过了。

我想知道的是:postgresql是否可以承受,毕竟这是一种完全有效的CSV格式。

更新

按照建议阅读以下帖子,我写道:

COPY test.large
FROM '/path/to/big.file'
WITH (
FORMAT CSV,
HEADER,
DELIMITER '|',
QUOTE '"',
NULL '',
FORCE_NULL appid
);

我得到:

ERREUR:  l'argument de l'option « force_null » doit être une liste de noms de colonnes

转化为CCD_ 16。知道吗?

COPY命令开关中似乎有点不一致,因为以下调用:

COPY test.large
FROM '/path/to/big.file'
WITH CSV HEADER DELIMITER '|' QUOTE '"' FORCE NULL appid;

如预期工作,或者如果使用键值对表示法,则必须添加_

COPY test.large
FROM '/path/to/big.file'
WITH (
FORMAT CSV,
HEADER,
DELIMITER '|',
QUOTE '"',
FORCE_NULL (appln_id)
);

这不是NULL,它是一个空字符串,这是另一回事。我不知道有什么方法可以让PG将空字符串视为空数字。我建议您导入到一个带有文本列而不是整数的临时表中,然后将数据移动到主表中,根据情况转换为数字

看看这个Q:PostgresqlCOPY空字符串为NULL不起作用

与你的场景非常相似,接受的答案描述了一种类似的技术

相关内容

  • 没有找到相关文章

最新更新