我正在尝试通过COPY FROM
将文本数据加载到postgresql数据库中。数据肯定不干净 CSV 。
输入数据并不总是一致的:有时会有多余的字段(分隔符是字段内容的一部分),或者整数字段中有空字符而不是0。
结果是PostgreSQL抛出错误并停止加载。
目前我正试图通过perl将数据按摩为一致。
有更好的策略吗?
在这方面,PostgreSQL可以被要求像 mysql 或 sqlite 一样宽容吗?
由于
答案 0 :(得分:1)
PostgreSQL的COPY FROM
并非旨在处理笨拙的数据而且非常严格。对狡猾数据的容忍度几乎没有支持。
我认为除了几天前发布的this proposed patch可能包含在PostgreSQL 9.3中之外,几乎没有兴趣添加任何内容。这个补丁被拒绝了,但表明对这个想法有一些兴趣;阅读帖子。
有时可能COPY FROM
进入一个具有所有TEMPORARY
字段而没有约束的临时text
表。然后你可以使用SQL从那里按摩数据。这只有在SQL至少是格式良好且规则的情况下才有效,并且听起来并不像你的那样。
如果数据不干净,您需要使用适当的脚本语言对脚本进行预处理。
有那个脚本:
INSERT
行; COPY
行;或COPY FROM
Python的csv
模块可以很方便。你可以使用你喜欢的任何语言; perl,python,php,Java,C,等等。
如果您热情,可以在PL/Perlu
或PL/Pythonu
中写下来,在阅读时插入数据并进行清理。我不打扰。