San*_*thy 1 csv postgresql delimiter
我想将csv文件导入psql db ...
我搜索并尝试使用副本,也参考https://www.commandprompt.com/ppbook/r23528,我使用的语法是:
copy location from 'file.csv' with delimiters '\t' NULL as 'NULL' CSV;
Run Code Online (Sandbox Code Playgroud)
注意:我的csv文件由'tab'分隔.
在第一次执行上面的cmd后,它显示:
ERROR: syntax error at or near ""\t""
LINE 1: ...om 'file.csv' using delimiters "\t" ;
Run Code Online (Sandbox Code Playgroud)
并且第二次,
ERROR: syntax error at or near "copy"
LINE 2: copy location from 'file.csv' using d...
Run Code Online (Sandbox Code Playgroud)
编辑完成后
我第二次尝试使用,
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"
Run Code Online (Sandbox Code Playgroud)
我的表格描述是
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 |
Run Code Online (Sandbox Code Playgroud)
怎么解决这个?
输入:
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
Run Code Online (Sandbox Code Playgroud)
这是一些例如输入......
当我在ms xcel工作表中打开此文件时,使用分隔符选项卡,它将数据正确分隔到相关的coloumn ..
输入带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
Run Code Online (Sandbox Code Playgroud)
每个文档的COPY说法,应该是WITH DELIMITER不DELIMITERS.
此外,COPY语法已更改,并鼓励您使用以下内容:
COPY location FROM 'file.csv' WITH (FORMAT csv, DELIMITER '\t', NULL 'NULL');
Run Code Online (Sandbox Code Playgroud)
编辑:
我已经使用提供的信息来测试如何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);
Run Code Online (Sandbox Code Playgroud)
我已经使用了上面提到的命令(采用了一点):
COPY atest FROM '/Users/viy/atest2.csv'
WITH (FORMAT csv, DELIMITER E'\t', NULL '\n');
Run Code Online (Sandbox Code Playgroud)
并得到与上述相同的错误.这是预期的,'因为有太多空字段.让我们看看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!
Run Code Online (Sandbox Code Playgroud)
因此,为了加载数据,您必须检查源数据并在中间删除一个额外的空字段.另一种方法是调整表的定义以匹配源数据.
| 归档时间: |
|
| 查看次数: |
11183 次 |
| 最近记录: |