2017-06-29 65 views
0

我有导入CSV数据到Postgres数据库与地理数据/ PostGIS的通过以下命令在我的数据库“地标”启用一个提交给Postgres:导入CSV新列

CREATE EXTENSION postgis; 

所以....故事如下:

我跟随此tutorial

我试图导入CSV这些列

name conf capital venture latitude longitude 

第一线,为数据的一个例子是:

example, 1, 1, 1, 51.51923, -0.12205 

我已经设置了表了教程以下除了在他的数据(地址,date_built,建筑,地标)增加的conf,资金和风险,而不是列。即:

CREATE TABLE landmarks 
(
    gid serial NOT NULL, 
    name character varying(50), 
    conf character varying(10), 
    capital character varying(10), 
    venture character varying(10), 
    the_geom geometry, 
    CONSTRAINT landmarks_pkey PRIMARY KEY (gid), 
    CONSTRAINT enforce_dims_the_geom CHECK (st_ndims(the_geom) = 2), 
    CONSTRAINT enforce_geotype_geom CHECK (geometrytype(the_geom) = 'POINT'::text OR the_geom IS NULL), 
    CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 4326) 
); 

然后

CREATE INDEX landmarks_the_geom_gist 
    ON landmarks 
    USING gist 
(the_geom); 

的数据基本上是相同的,否则他的example

我已经正确设置了表格并启用了postgis扩展来处理好geom数据。

然而,问题是当我试图导入我的CSV:

landmarks=# \copy landmarks(name,conf,capital,venture,latitude,longitude) FROM '../../../../../var/tmp/map2.csv' DELIMITERS ',' CSV HEADER; 
ERROR: column "latitude" of relation "landmarks" does not exist 

现在,我注意到,当他创造了桌上,他不添加经纬度列...所以我想知道如果是这样的问题,并试图建立与这些列以及整数另一个表,但只是给我这个错误:

ptmap3=# \copy landmarks(name,conf,capital,venture,latitude,longitude) FROM '../../../../../var/tmp/map2.csv' DELIMITERS ',' CSV HEADER; 
ERROR: invalid input syntax for integer: "51.51923" 
CONTEXT: COPY landmarks, line 2, column latitude: "51.51923" 

所以......看来,如果我添加了纬度列,然后它的工作原理,但数据失败?使用这种

od -c map2.csv 

检查错误的CSV之后...有什么错我的CSV(没有隐藏字符或错误)......所以这是怎么回事?

如果任何人都可以帮我导入我的csv到这个数据库,我将非常感激!

+0

错误:整数无效输入语法:“51.51923”分配一个字符串值的整数列时将发生该错误。你可以检查数据是如何在csv文件中获得经纬度的 –

+0

在命令行中使用od读取,该值以character-for-character的形式存储为5 1。 5 1 9 2 3, –

回答

0

您需要分两步处理,将您的(latitude,longitude)数据导入数据库的几何列。

1。将数据导入两条浮法列latitudelongitude

从原始表的地标:

CREATE TABLE landmarks 
(
    gid serial NOT NULL, 
    name character varying(50), 
    conf character varying(10), 
    capital character varying(10), 
    venture character varying(10), 
    the_geom geometry, 
    CONSTRAINT landmarks_pkey PRIMARY KEY (gid), 
    CONSTRAINT enforce_dims_the_geom CHECK (st_ndims(the_geom) = 2), 
    CONSTRAINT enforce_geotype_geom CHECK (geometrytype(the_geom) = 'POINT'::text OR the_geom IS NULL), 
    CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 4326) 
); 

CREATE INDEX landmarks_the_geom_gist 
    ON landmarks 
    USING gist 
(the_geom); 

添加临时两列latitudelongitude

ALTER TABLE landmarks ADD COLUMN latitude double precision; 
ALTER TABLE landmarks ADD COLUMN longitude double precision; 

然后导入您的数据:

\copy landmarks(name,conf,capital,venture,latitude,longitude) FROM '../../../../../var/tmp/map2.csv' DELIMITERS ',' CSV HEADER; 

2.通过从latitudelongitude创建点几何填充几何列:

UPDATE landmarks SET geom = ST_SetSRID(ST_MakePoint(longitude,latitude),4326); 

最后,删除临时列:

ALTER TABLE landmarks DROP COLUMN latitude; 
ALTER TABLE landmarks DROP COLUMN longitude; 
0

有一个替代方法。

  1. Google pgfutter并下载相应版本的可执行文件。(https://github.com/lukasmartinelli/pgfutter/releases/download/v1.1/pgfutter_windows_amd64.exe)链接的窗口,但其他版本也可用。
  2. 确保pgfutter文件和yourdata.csv文件位于相同的目录中。
  3. 在终端中设置目录并运行以下代码。
  4. 这也会创建一个新表格,只需输入一个新的表格名称即可。

    pgfutter.exe --host "localhost" --port "5432" --db "YourDatabaseName" --schema "public" --table "TableName" --user "postgres" --pw "YourPassword" csv YourData.csv