我有一个大的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不起作用
与你的场景非常相似,接受的答案描述了一种类似的技术