【发布时间】:2019-10-23 18:16:26
【问题描述】:
我有一个很大的 CSV 文件,其中所有列都用 " 引用。
空值表示为"",列分隔符为|。
我想使用 postgresql(版本 10.7)中的 COPYcommand 来摄取这些文件。
我尝试了很多组合,但对我来说更自然的是:
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 格式。即使是文本格式,您也可能更喜欢空字符串 您不想将空值与空字符串区分开来的情况。 使用二进制格式时不允许使用此选项。
我知道我可以通过使用sed 或一些正则表达式/替换操作将...|""|... 更改为...||... 来清理文件。这将解决我的问题,我已经检查过了。
我想知道的是:postgresql 是否可以忍受,毕竟这是完全有效的 CSV 格式。
更新
按照建议阅读following post,我写道:
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
转换为force_null must be a list of column names。有什么想法吗?
【问题讨论】:
标签: postgresql csv null postgresql-copy