我正在尝试通过COPY FROM
将文本数据加载到postgresql 数据库中。数据绝对不是干净的 CSV。
输入数据并不总是一致的:有时会有多余的字段(分隔符是字段内容的一部分)或整数字段中有空值而不是 0。
结果是 PostgreSQL 抛出错误并停止加载。
目前我正在尝试通过 perl 处理数据使其保持一致。
有没有更好的策略?
是否可以要求 PostgreSQL 在这方面像 mysql 或 sqlite 一样宽容?
谢谢
最佳答案
PostgreSQL 的COPY FROM
不是为处理复杂数据而设计的,而且非常严格。几乎没有人支持容忍不可靠的数据。
在看到 this proposed patch 之前,我认为没有兴趣添加任何内容几天前发布,可能包含在 PostgreSQL 9.3 中。该补丁已被断然拒绝,但表明人们对这个想法有些兴趣;阅读主题。
有时可以COPY FROM
到临时TEMPORARY
表中,该表具有所有text
字段且没有约束。然后您可以从那里使用 SQL 处理数据。不过,这只有在 SQL 至少格式正确且规则的情况下才有效,而且听起来不像你的那样。
如果数据不干净,您需要使用合适的脚本语言编写的脚本对其进行预处理。
有那个脚本:
- 连接到 PostgreSQL 和
INSERT
行; - 连接到 PostgreSQL 并使用脚本语言的 Pg API 来
COPY
行;或 - 写出您可以
COPY FROM
的干净 CSV
Python 的 csv
模块可以派上用场。你可以使用任何你喜欢的语言; perl、python、php、Java、C 等等。
如果您有热情,可以用 PL/Perlu
或 PL/Python
编写,在读取数据时插入数据并清理数据。我不会打扰。
关于postgresql - COPY FROM 可以容忍地使用错误的 CSV 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12457190/