COPY FROM可以容忍消耗坏的CSV吗?

时间:2012-09-17 10:15:29

标签: postgresql etl postgresql-9.1

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

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

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

目前我正试图通过perl将数据按摩为一致。

有更好的策略吗?

在这方面,PostgreSQL可以被要求像 mysql sqlite 一样宽容吗?

由于

1 个答案:

答案 0 :(得分:1)

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/PerluPL/Pythonu中写下来,在阅读时插入数据并进行清理。我不打扰。