我在我的数据库中创建了一个名为' 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种不同类型的数据中提取两个数据值。文件与否?
或者我写的语法中只有一个错误? 写它的正确方法是什么?
答案 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文件,删除不需要的列并保存,只有date
和kgs
列仍然存在。
或者,COPY
到与CSV
具有相同列的临时表,然后执行INSERT INTO ... SELECT
只将所需数据传输到真实目标表。