仅从输入CSV复制一些列?

use*_*694 5 postgresql

我在数据库中创建了一个名为“ con”的表,该表具有两列,分别名为“ date”和“ kgs”。我试图从复制到此位置“ H:Sir \ data \ reporting \ hi.rpt”上的“ 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'
Run Code Online (Sandbox Code Playgroud)

我得到错误:

错误:“日期”或附近的语法错误
第5行:日期为“基准/时间” 
           ^
**********错误**********
错误:“日期”或附近的语法错误
SQL状态:42601
人物:113

我从中读取数据的“ hi.rpt”文件看起来像这样:

Datum / Uhrzeit,Sta。,Bez。,单位,TBId,批次,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种不同类型的数据中仅提取两个数据值?

还是我编写的语法中只有一个错误?正确的书写方式是什么?

Cra*_*ger 6

我不知道你从哪里得到这种语法,但COPY没有像这样的列别名列表。查看帮助:

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

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

没有映射工具COPY可以让您仅读取输入 CSV 的某些列。这真的很有用,但还没有人有时间/兴趣/资金来实施它。无论如何,这实际上只是人们想要的众多数据转换/过滤任务之一。

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

COPY con (date,kgs)
Run Code Online (Sandbox Code Playgroud)

那么 PostgreSQL 将期望输入 CSV正好有两列。它将使用第一个 csv 列作为"date"表格列,使用第二个 csv 列作为"kgs"表格列。它不关心 CSV 标头是什么,如果您指定 ,它们将被忽略WITH (FORMAT CSV, HEADER ON),或者如果您不指定HEADER.

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

如果它是一个小文件,只需在您选择的电子表格中打开一个副本作为 csv 文件,删除不需要的列,然后保存它,这样就只剩下datekgs列了。

或者,COPY对于与 具有所有相同列的临时表CSV,然后INSERT INTO ... SELECT仅将所需数据传输到实际目标表中。