2012-07-06 120 views
1

我想导入CSV文件给psql分贝......导入CSV文件导入PSQL分贝

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

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

注意:我的csv文件由“选项卡”分隔。

执行上述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艾克赛尔片这个文件,用分隔符标签,它正确的方式隔开数据到培训相关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 

回答

5

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! 

所以,为了得到的数据加载,你必须检查你的源数据并删除多余的空场中间。另一种方法是调整表格的定义以匹配您的源数据。

+0

谢谢您的回答,这可能是你说我改变了我的语法 副本的位置从“FILE.CSV”与分隔符E中的Postgres 9.1.4是有用的, 我使用的Postgres 8.3,“\ t” NULL作为'NULL'CSV; 错误:去年预期的列 上下文后额外的数据:副本的位置,第1行: “AD \t AD100 \t卡尼略\t \t \t \t \t \t \t 42.5833 \t 1.6667 \t 6” 如何解决这个问题? – 2012-07-06 13:56:13

+0

@SangeethaNarayanaMoorthy,请将你的表的定义包含到帖子中(使用psql的'\ d + 命令)。 – vyegorov 2012-07-06 14:03:22

+0

列|类型|修饰符 ------------- + ------------------------ + --------- - countrycode |字符变化(2)| postalcode |字符变化(20)| 地方|字符变化(100)| 状态|字符变化(20)| 国家|字符变化(100)| country2 |字符变化(20)| 社区|字符变化(100)| community2 |字符变化(20)| 纬度|双精度| 经度|双精度| 准确性|整数| – 2012-07-09 04:55:35