簡體   English   中英

將CSV文件導入到PSQL DB中

[英]Import csv file into psql db

我想將csv文件導入到psql db ...

我已經搜索並嘗試使用copy(也稱為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... 

編輯后,

第二次我嘗試使用like,

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工作表中打開此文件時,使用分隔符選項卡,它會將數據正確分隔到相關的事件列。

輸入帶有tab和null值的文件,

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

根據 COPY語句上的文檔 ,它應該是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!

因此,為了加載數據,您必須查看源數據並在中間刪除一個多余的空字段。 另一種方法是調整表的定義以匹配您的源數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM