postgresql - 将 csv 文件导入 psql 数据库

标签 postgresql csv delimiter

我想将 csv 文件导入到 psql 数据库...

我已经搜索并尝试使用副本,也提到了 https://www.commandprompt.com/ppbook/r23528我使用的语法是:

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

注意:我的 csv 文件由“制表符”分隔。

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

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

这是一些用于输入的 eg...

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

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

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

最佳答案

Per documentationCOPY 语句中,它应该是 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!

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

关于postgresql - 将 csv 文件导入 psql 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11363005/

相关文章:

sql - 从第一个条目到当前行条目的行日期之间的差异(以天为单位)

sql - 在 postgres 中获取一个或多个具有最大值和计数的值

java - 解析 csv 时保留引号

java - 使用扫描仪读取 csv 文件值,useDelimiter (";")不起作用

sql - 在函数中使用查询结果(postgres 8.3)

javascript - 未处理的拒绝 SequelizeDatabaseError : column "foo_bar" of relation "bar" already exists

ruby - 如何从 ruby​​ 中的哈希中获取正确的 csv 格式

python - 如何从 CSV 文件创建 "clean"数据表

java - 如何确定文本是否具有平衡分隔符?

java - 在添加分隔符后在Java中分割字符串