自动将csv文件合并到具有不同列的postgres表

时间:2016-07-11 02:14:10

标签: postgresql pandas postgresql-9.1 pgadmin

我有一个主Postgres表:

visitIp        userId   idSite
10.12.0.1       a       35
10.12.0.1       a       35
10.12.0.1       b       35
24.222.206.154  b       35

我有一个新的csv文件,每天生成但有不同的列。只有列'visitIp'和idSite'相同。有时他们会有一个额外的列,比如'action'。有没有办法将它们合并到表中并自动化该过程。一个示例csv文件是:

visitIp       action    idSite
10.12.0.1         1      35
10.12.0.1         2      35
24.222.206.154    1      35

所以在合并后它应该是:

visitIp        userId   idSite  action
10.12.0.1        a        35    
10.12.0.1        a        35    
10.12.0.1        b        35    
24.222.206.154   b        35    
10.12.0.1                 35     1
10.12.0.1                 35     2
24.222.206.154            35     1

我尝试了COPY命令并使用PGadmin导入。不工作。还有一种方法可以使过程自动化。任何想法都会非常有用。 Postgres新手

1 个答案:

答案 0 :(得分:0)

Linux - 命令行:

  1. 打开一个新文本文件并将其命名为test.sql

    vi test.sql

  2. 复制以下内容并粘贴到test.sql

  3. DROP TABLE csvfile1;
    DROP TABLE csvfile2;
    DROP TABLE master;
    
    CREATE TABLE master(visitip inet, userID varchar, action integer, idsite integer);
    
    INSERT INTO master(visitip , action, idsite) VALUES('10.12.0.1', 1, 35);
    INSERT INTO master(visitip , action, idsite) VALUES('10.12.0.1', 2, 35);
    INSERT INTO master(visitip , action, idsite) VALUES('24.222.206.154', 1, 35);
    
    CREATE TABLE csvfile1(visitip inet, userID varchar, action integer, idsite integer) INHERITS (master);
    
    COPY csvfile1(visitip,userid,idsite) FROM '/tmp/csvfile.csv' DELIMITER ',' CSV;
    
    CREATE TABLE csvfile2(visitip inet, userID varchar, action integer, idsite integer) INHERITS (master);
    
    COPY csvfile2(visitip,userid,idsite) FROM '/tmp/csvfile.csv' DELIMITER ',' CSV;
    
    SELECT * FROM master;
    SELECT * FROM csvfile1;
    SELECT * FROM csvfile2;
    
    1. 保存并退出文件

      :WQ

    2. 打开终端并以postgres用户(或数据库群集的所有者)身份登录

    3. 执行sql脚本

      psql -f test.sql

    4. <强> 2。 pgAdmin的:

      1. 打开SQL查询工具
      2. 复制并粘贴test.sql的内容,确保csvfile的路径正确。您的可能与我在COPY命令中的不同。
      3. 单击工具栏菜单中的绿色直角三角形来执行查询。
      4. 您的csvfile.csv包含

          

        “10.12.0.1”,A,35

             

        “10.12.0.1”,a,35

             

        “10.12.0.1”,B,35

             

        “24.222.206.154”,B,35

        <强>输出:

        postgres=# select * from master;
            visitip     | userid | action | idsite 
        ----------------+--------+--------+--------
         10.12.0.1      |        |      1 |     35
         10.12.0.1      |        |      2 |     35
         24.222.206.154 |        |      1 |     35
         10.12.0.1      | a      |        |     35
         10.12.0.1      | a      |        |     35
         10.12.0.1      | b      |        |     35
         24.222.206.154 | b      |        |     35
         10.12.0.1      | a      |        |     35
         10.12.0.1      | a      |        |     35
         10.12.0.1      | b      |        |     35
         24.222.206.154 | b      |        |     35
        (11 rows)
        
        postgres=# select * from csvfile1;
            visitip     | userid | action | idsite 
        ----------------+--------+--------+--------
         10.12.0.1      | a      |        |     35
         10.12.0.1      | a      |        |     35
         10.12.0.1      | b      |        |     35
         24.222.206.154 | b      |        |     35
        (4 rows)
        
        postgres=# select * from csvfile2;
            visitip     | userid | action | idsite 
        ----------------+--------+--------+--------
         10.12.0.1      | a      |        |     35
         10.12.0.1      | a      |        |     35
         10.12.0.1      | b      |        |     35
         24.222.206.154 | b      |        |     35
        (4 rows)