postgresql - COPY FROM 可以容忍地使用错误的 CSV 吗?

标签 postgresql etl postgresql-9.1

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

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

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

目前我正在尝试通过 perl 处理数据使其保持一致。

有没有更好的策略?

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

谢谢

最佳答案

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/Python 编写,在读取数据时插入数据并清理数据。我不会打扰。

关于postgresql - COPY FROM 可以容忍地使用错误的 CSV 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12457190/

相关文章:

java - 如何进行ETL流程性能测试

node.js - PostgreSQL 9.1 中的 UPDATE 似乎误用了占位符类型

storage - 在文件系统级别确定 PostgreSQL 中表的实际文件名

math - SSIS · 三角函数

sql - 从 RavenDB 到 SQL 的 ETL

postgresql - 从 postgres 中的动态表名中删除

json - postgresql - 查询以建立 json

django - Docker postgres

postgresql - 处或附近的语法错误;

sql - 无法从 plpgsql 函数内的动态命名临时表运行 'select into'