将csv文件导入psql db

时间:2012-07-06 13:21:10

标签: postgresql csv delimiter

我想将csv文件导入psql db ...

我搜索并尝试使用副本,也称为https://www.commandprompt.com/ppbook/r23528,我使用的语法是:

copy location from 'file.csv' with delimiters '\t' NULL as 'NULL' CSV;

注意:我的csv文件由'tab'分隔。

第一次执行上述cmd后,显示:

ERROR:  syntax error at or near ""\t""
LINE 1: ...om 'file.csv' using delimiters "\t" ;

并且第二次

ERROR:  syntax error at or near "copy"
LINE 2: copy location from 'file.csv' using d... 

编辑后,

我第二次尝试使用,

copy location from 'file.csv' with delimiter E'\t' NULL as 'NULL' CSV;

ERROR: extra data after last expected column 
CONTEXT: COPY location, line 1: "AD AD100   Canillo  42.5833    1.6667  6" 

我的表格描述是

Table "public.location"

 Column    |          Type          | Modifiers 
-------------+------------------------+-----------
 countrycode | character varying(2)   | 
 postalcode  | character varying(20)  | 
 place       | character varying(100) | 
 state       | character varying(20)  | 
 country     | character varying(100) | 
 country2    | character varying(20)  | 
 community   | character varying(100) | 
 community2  | character varying(20)  | 
 latitude    | double precision       | 
 longitude   | double precision       | 
 accuracy    | integer                | 

如何解决这个问题?

输入:

AD      AD100   Canillo                                                 42.5833 1.6667  6
AD      AD200   Encamp                                                  42.5333 1.6333  6
AD      AD300   Ordino                                                  42.6    1.55    6
AD      AD400   La Massana                                                      42.5667 1.4833  6
AD      AD500   Andorra la Vella                                                        42.5    1.5     6
AD      AD600   Sant Julià de Lòria                                                     42.4667 1.5     6
AD      AD700   Escaldes-Engordany                                                      42.5    1.5667  6
AR      3636    "POZO CERCADO (EL CHORRO (F), DPTO. RIVADAVIA (S))"     SALTA   A                                       -23.4933        -61.9267        3
AR      4123    LAS SALADAS     SALTA   A                                       -25.7833        -64.5   4
AR      4126    LA MARAVILLA    SALTA   A                                       -26.0833        -65.263 3
AR      4126    TALA    SALTA   A                                       -26.1167        -65.2833        4
AR      4126    LA ASUNCION     SALTA   A                                       -26.0833        -65.263 3
AR      4126    BRETE   SALTA   A                                       -26.0667        -65.3667        4
AR      4126    EL SUNCHAL      SALTA   A                                       -26.0833        -65.263 3
AR      4126    CEIBAL  SALTA   A                                       -26.1   -65.0167        4
AR      4126    BARADERO        SALTA   A                                       -26.0833        -65.263 3
AR      4126    CANDELARIA      SALTA   A                                       -26.1   -65.1   4
AR      4126    ALEM    SALTA   A                                       -26.0833        -65.263 3
AR      4126    EL BRETE        SALTA   A                                       -26.0667        -65.3667        4
AR      4126    EL CUIBAL       SALTA   A                                       -26.0833        -65.263 3
AR      4126    EL JARDIN       SALTA   A                                       -26.0833        -65.3833        4
AR      4126    OVEJERO SALTA   A                                       -26.0833        -65.263 3
AR      4126    LOS MOGOTES     SALTA   A                                       -26.0333        -65.2   4
AR      4126    "MIRAFLORES (TALA, DPTO. CANDELARIA)"   SALTA   A                                       -26.0833        -65.263 3

这是一些例如输入......

当我在ms xcel工作表中打开此文件时,使用分隔符选项卡,它将数据正确分隔到相关的coloumn ..

输入带有制表符和空值的文件,

AD\tAD100\tCanillo\t\n\t\n\t\n\t\n\t\n\t\n\t42.5833\t1.6667\t6
AD\tAD200\tEncamp\t\n\t\n\t\n\t\n\t\n\t\n\t42.5333\t1.6333\t6
AR\t3636\t"POZO CERCADO (EL CHORRO (F), DPTO. RIVADAVIA (S))"\tSALTA\tA\t\n\t\n\t\n\t\n\t-23.4933\t-61.9267\t3

1 个答案:

答案 0 :(得分:5)

COPY声明中的

Per documentation,应该是WITH DELIMITER而不是 DELIMITERS

此外,COPY语法已更改,我们鼓励您使用以下内容:

COPY location FROM 'file.csv' WITH (FORMAT csv, DELIMITER '\t',  NULL 'NULL');

修改

我已使用提供的信息来测试COPY对所呈现数据的处理方式:

CREATE TABLE atest (
    countrycode text CHECK (length(countrycode) <= 2),
    postalcode  text CHECK (length(postalcode) <=20), 
    place       text CHECK (length(place) <= 100), 
    state       text CHECK (length(state) <= 20), 
    country     text CHECK (length(country) <= 100), 
    country2    text CHECK (length(country2) <= 20), 
    community   text CHECK (length(community) <= 100), 
    community2  text CHECK (length(community2) <= 20),
    latitude    double precision,
    longitude   double precision,
    accuracy    integer);

我使用了上面提到的命令(采用了一点):

COPY atest FROM '/Users/viy/atest2.csv'
     WITH (FORMAT csv, DELIMITER E'\t',  NULL '\n'); 

并得到与上述相同的错误。这是预期的,'因为有太多空字段。让我们看一下CSV数据以及它与表定义的匹配情况(所有\t替换为新行):

AD       countrycode
AD100    postalcode
Canillo  place
\n       state
\n       country
\n       country2
\n       community
\n       community2
\n       latitude
42.5833  longitude
1.6667   accuracy
6        <-- this one gives the error!

因此,为了加载数据,您必须检查源数据并在中间删除一个额外的空字段。另一种方法是调整表的定义以匹配源数据。