从特定行号开始导入csv文件

时间:2018-01-12 21:37:28

标签: postgresql csv import

我想将csv文件导入到从csv文件的第9行开始的表中。如何在postgresql中指定这个条件?

前8行有一堆不相关的文字描述下面的数据。这是导入Excel的文件的屏幕截图。

enter image description here

这是我的数据库中的表我试图将数据插入。

CREATE TABLE trader.weather
(
station text NOT NULL,
"timestamp" timestamp with time zone NOT NULL,
temp numeric(6,2),
wind numeric(6,2)
)

2 个答案:

答案 0 :(得分:1)

可以 使用Postgres完成,而不是直接使用COPY

使用这样的临时登台表:

CREATE TEMP TABLE target_tmp AS
TABLE target_tbl LIMIT 0;  -- create temp table with same columns as target table

COPY target_tmp FROM '/absolute/path/to/file' (FORMAT csv);

INSERT INTO target_tbl
TABLE  target_tmp 
OFFSET 8;  -- start with line 9

DROP TABLE target_tmp; -- optional, else it's dropped at end of session automatically

跳过的行也必须有效。

显然,这种情况更为昂贵 - 对于中小型桌子而言,这一点并不重要。与大桌子有关系。那么你真的应该在导入之前修剪输入文件中的剩余行。

确保您的temp_buffers设置足以容纳临时表,以最大限度地降低性能损失。

相关(包含没有超级用户权限的\copy的说明):

答案 1 :(得分:0)

不能在PostgreSQL上完成,你应该在postgres之前使用外部工具或进程来完成。

根据手册,您可以对CSV执行的唯一处理大多是QUOTENULL相关:

COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | STDIN }
    [ [ WITH ]
          [ BINARY ]
          [ OIDS ]
          [ DELIMITER [ AS ] 'delimiter' ]
          [ NULL [ AS ] 'null string' ]
          [ CSV [ HEADER ]
                [ QUOTE [ AS ] 'quote' ]
                [ ESCAPE [ AS ] 'escape' ]
                [ FORCE NOT NULL column_name [, ...] ] ] ]

COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
    TO { 'filename' | STDOUT }
    [ [ WITH ]
          [ BINARY ]
          [ OIDS ]
          [ DELIMITER [ AS ] 'delimiter' ]
          [ NULL [ AS ] 'null string' ]
          [ CSV [ HEADER ]
                [ QUOTE [ AS ] 'quote' ]
                [ ESCAPE [ AS ] 'escape' ]
                [ FORCE QUOTE { column_name [, ...] | * } ] ] ]

在PostgreSQL中使用CSV之前,有很多方法可以自动更改CSV,你应该检查其他选项。