2

我正在尝试通过将文本数据加载到 postgresql 数据库中COPY FROM。数据绝对不是干净的CSV

输入数据并不总是一致的:有时会有多余的字段(分隔符是字段内容的一部分),或者整数字段中有空值而不是 0。

结果是 PostgreSQL 抛出错误并停止加载。

目前我正在尝试通过 perl 将数据按摩成一致性。

有更好的策略吗?

可以要求 PostgreSQL在这方面像mysqlsqlite一样宽容吗?

谢谢

4

1 回答 1

1

PostgreSQL 的COPY FROM设计不是为了处理庞大的数据,而且非常严格。对不可靠数据的容忍度几乎没有支持。

在我看到几天前发布的这个提议的补丁可能包含在 PostgreSQL 9.3 中之前,我认为添加任何内容几乎没有兴趣。该补丁已被强烈拒绝,但表明人们对这个想法很感兴趣;阅读线程。

有时可以进入一个包含所有字段且没有约束COPY FROM的临时TEMPORARY表。text然后,您可以从那里使用 SQL 处理数据。不过,这只有在 SQL 至少格式正确且规则的情况下才有效,而且听起来不像你的那样。

如果数据不干净,您需要使用合适脚本语言的脚本对其进行预处理。

有那个脚本:

  • 连接到 PostgreSQL 和INSERT行;
  • 连接到 PostgreSQL 并使用脚本语言的 Pg API 来插入COPY行;或者
  • 写出干净的 CSV,你可以COPY FROM

Python 的csv模块可以很方便地做到这一点。您可以使用任何您喜欢的语言;perl、python、php、Java、C 等等。

如果你有热情,你可以把它写进PL/PerluPL/Pythonu,在你读的时候插入数据并清理它。我不会打扰。

于 2012-09-17T10:20:38.240 回答