仅复制输入CSV中的某些列?

时间:2014-06-30 05:45:19

标签: postgresql

我在我的数据库中创建了一个名为' con'它有两列,名称为' date'和''我正试图从这个' hi.rpt'中提取数据。在此位置复制的文件' H:Sir \ data \ reporting \ hi.rpt'并希望将值存储在表格中#con;在我的数据库中。

我在pgadmin

中尝试过这段代码

当我跑步时:

COPY con (date,kgs) 
FROM 'H:Sir\data\reporting\hi.rpt'
WITH DELIMITER ','
CSV HEADER 
    date AS 'Datum/Uhrzeit'
    kgs  AS 'Summe'

我收到错误:

ERROR:  syntax error at or near "date"
LINE 5:    date AS 'Datum/Uhrzeit' 
           ^
********** Error **********
ERROR: syntax error at or near "date"
SQL state: 42601
Character: 113

" hi.rpt"我正在读取数据的文件如下所示:

Datum/Uhrzeit,Sta.,Bez.,Unit,TBId,Batch,OrderNr,Mat1,Total1,Mat2,Total2,Mat3,Total3,Mat4,Total4,Mat5,Total5,Mat6,Total6,Summe
41521.512369(04.09.13 12:17:48),TB01,TB01,005,300,9553,,2,27010.47,0,0.00,0,0.00,3,1749.19,0,0.00,0,0.00,28759.66
41521.547592(04.09.13 13:08:31),TB01,TB01,005,300,9570,,2,27057.32,0,0.00,0,0.00,3,1753.34,0,0.00,0,0.00,28810.66

是否有可能只从我在这个' hi.rpt'中提取的20种不同类型的数据中提取两个数据值。文件与否?

或者我写的语法中只有一个错误? 写它的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

我不知道你在哪里获得了这种语法,但是COPY并没有像这样列出列别名。请参阅帮助:

COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | PROGRAM 'command' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]

AS不是列出的选项之一;要在psql中查看完整输出运行\d copy,或在线查看copy命令的手册。

COPY中没有允许您只读取输入CSV的某些列的映射工具。它真的很有用,但是没有人有时间/兴趣/资金来实现它。它实际上只是人们想要的许多数据转换/过滤任务中的一个。

PostgreSQL希望COPY中给出的列列表从左到右与CSV文件中的列表顺序相同,并且具有与CSV相同的条目数文件有列。所以,如果你写:

COPY con (date,kgs)

然后PostgreSQL将期望输入CSV与正好两列。它将"date"表列的第一个csv列和"kgs"表列的第二个csv列使用。它并不关心CSV标题是什么,如果您指定WITH (FORMAT CSV, HEADER ON),它们将被忽略,或者如果您未指定HEADER则将其视为普通数据行。

PostgreSQL 9.4将FROM PROGRAM添加到COPY,因此您可以运行shell命令来读取文件并对其进行过滤。一个简单的Python或Perl脚本可以完成这项工作。

如果它是一个小文件,只需在您选择的电子表格中打开一个副本作为csv文件,删除不需要的列并保存,只有datekgs列仍然存在。

或者,COPY到与CSV具有相同列的临时表,然后执行INSERT INTO ... SELECT只将所需数据传输到真实目标表。