我正在尝试通过将文本数据加载到 postgresql 数据库中COPY FROM
。数据绝对不是干净的CSV。
输入数据并不总是一致的:有时会有多余的字段(分隔符是字段内容的一部分),或者整数字段中有空值而不是 0。
结果是 PostgreSQL 抛出错误并停止加载。
目前我正在尝试通过 perl 将数据按摩成一致性。
有更好的策略吗?
可以要求 PostgreSQL在这方面像mysql或sqlite一样宽容吗?
谢谢
我正在尝试通过将文本数据加载到 postgresql 数据库中COPY FROM
。数据绝对不是干净的CSV。
输入数据并不总是一致的:有时会有多余的字段(分隔符是字段内容的一部分),或者整数字段中有空值而不是 0。
结果是 PostgreSQL 抛出错误并停止加载。
目前我正在尝试通过 perl 将数据按摩成一致性。
有更好的策略吗?
可以要求 PostgreSQL在这方面像mysql或sqlite一样宽容吗?
谢谢
PostgreSQL 的COPY FROM
设计不是为了处理庞大的数据,而且非常严格。对不可靠数据的容忍度几乎没有支持。
在我看到几天前发布的这个提议的补丁可能包含在 PostgreSQL 9.3 中之前,我认为添加任何内容几乎没有兴趣。该补丁已被强烈拒绝,但表明人们对这个想法很感兴趣;阅读线程。
有时可以进入一个包含所有字段且没有约束COPY FROM
的临时TEMPORARY
表。text
然后,您可以从那里使用 SQL 处理数据。不过,这只有在 SQL 至少格式正确且规则的情况下才有效,而且听起来不像你的那样。
如果数据不干净,您需要使用合适脚本语言的脚本对其进行预处理。
有那个脚本:
INSERT
行;COPY
行;或者COPY FROM
Python 的csv
模块可以很方便地做到这一点。您可以使用任何您喜欢的语言;perl、python、php、Java、C 等等。
如果你有热情,你可以把它写进PL/Perlu
或PL/Pythonu
,在你读的时候插入数据并清理它。我不会打扰。