使用新列将CSV导入postgres

时间:2017-06-29 10:58:55

标签: postgresql csv postgis

我有一个问题是将csv数据导入到postgres数据库,并在我的数据库'landmarks'上通过以下命令启用了地理数据/ postgis:

CREATE EXTENSION postgis;

所以......故事如下:

我正在关注此tutorial

我正在尝试使用这些列导入csv

name    conf    capital venture latitude    longitude

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

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

我已经按照教程设置了表格,除了添加conf,capital和venture而不是他的数据中的列(address,date_built,architect,landmark)。即:

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"

所以......似乎如果我添加纬度列然后它可以工作,但是数据失败了吗?使用此

检查csv错误后
od -c map2.csv

...我的csv没有任何问题(没有隐藏的字符或错误)......那么这笔交易是什么?

如果有人可以帮助我将csv导入此db,我将非常感激!

2 个答案:

答案 0 :(得分: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创建POINT几何来填充几何列:

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

最后,删除临时列:

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

答案 1 :(得分:0)

还有另一种方法。

  1. Google pgfutter并下载适当版本的可执行文件。(https://github.com/lukasmartinelli/pgfutter/releases/download/v1.1/pgfutter_windows_amd64.exe)链接用于Windows,但其他版本也可用。
  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