使用psql \ copy导入csv,根据需要修改数据

时间:2015-03-13 01:41:25

标签: postgresql csv psql

我经常需要将csv导入postgres,并且通常使用\copy中的psql命令。它通常看起来像这样

\copy tbl FROM import.csv CSV 

我有两个常见的问题,我觉得可能有类似的答案。

  1. 解析日期字符串,因为它们进入TIMESTAMP字段
  2. 导致错误的INTEGER字段中的空字符串
  3. 在这两种情况下都需要进行少量修改,但我目前的解决方案是创建所有字段为VARCHAR的加载表,然后创建具有正确模式的另一个表。然后我使用\copy

    CREATE TABLE loading_tbl (
        datefield VARCHAR,
        integerfield VARCHAR
    );    
    
    CREATE TABLE tbl (
        datefield TIMESTAMP,
        integerfield INTEGER
    );
    
    \copy loading_tbl FROM import.csv CSV
    
    INSERT INTO tbl (datefield, integerfield)
    SELECT
        to_timestamp(datefield, 'YYYY-Mon, DAY HH24:MI a.m'),
        integerfield::INTEGER
    FROM loading_tbl;
    
    DROP TABLE loading_tbl;
    

    这是最好的方法还是有更简单的方法?创建两个表是一种痛苦,特别是当字段数增加时。

1 个答案:

答案 0 :(得分:0)

另一种选择是使用脚本语言来执行 ETL 。根据您的具体需求,可能更容易推理和/或减少开销。

例如,您可以使用 Python csv psycopg2 模块与 CSV进行交互 file和 Postgres 数据库,分别执行必要的 ETL psycopg2 通常会将时间戳字符串处理为实际的 Postgres 时间戳转换(假设它是一个已识别的时间戳字符串,其中有多种类型)。

如果 CSV 中的字段是 Postgres 中的整数但 CSV 中的空字符串,则 Python 脚本,您可以检查空字符串值并将它们分配为 NULL ,而不是 Postgres

我最近使用 Python 来做这样的事情,结果很好。对问题解决方案的最大胜利可能是缺少需要过渡表,因为 ETL 可以在脚本中完成,然后通过<发送到 Postgres EM> psycopg2

如果您的 ETL 需要适度,即仅限于您在上面提供的示例,则可能值得坚持使用纯 SQL 。对此的一个增强是使用temp table(对于loading_tbl)而不是常规表。这样你就不用担心在 ETL 之后删除它了。