Postgresql 使用新列将CSV导入postgres

Postgresql 使用新列将CSV导入postgres,postgresql,csv,postgis,Postgresql,Csv,Postgis,我在将csv数据导入postgres数据库时遇到一个问题,通过以下命令在我的数据库“landmarks”上启用了geo data/postgis: CREATE EXTENSION postgis; 所以。。。。故事是这样的: 我正在关注这一点 我正在尝试导入带有这些列的csv name conf capital venture latitude longitude 作为数据示例,第一行是: example, 1, 1, 1, 51.51923, -0.12205 除了添

我在将csv数据导入postgres数据库时遇到一个问题,通过以下命令在我的数据库“landmarks”上启用了geo data/postgis:

CREATE EXTENSION postgis;
所以。。。。故事是这样的:

我正在关注这一点

我正在尝试导入带有这些列的csv

name    conf    capital venture latitude    longitude
作为数据示例,第一行是:

example, 1, 1, 1, 51.51923, -0.12205
除了添加conf、capital和venture,而不是在他的数据(地址、建造日期、建筑师、地标)中添加列之外,我已经按照教程设置了表格。i、 e:

然后

除此之外,数据与他的基本相同

我已经正确地设置了表,并启用了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到这个数据库,我将非常感激

要将
(纬度、经度)
数据导入数据库的几何体列,需要分两步进行处理

1.将数据导入两个浮动列
纬度
经度

UPDATE landmarks SET geom = ST_SetSRID(ST_MakePoint(longitude,latitude),4326);
从原始表地标:

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 );
添加临时两列
纬度
经度

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.通过从
纬度
经度
创建点几何图形来填充几何图形列:

UPDATE landmarks SET geom = ST_SetSRID(ST_MakePoint(longitude,latitude),4326);
最后,删除临时列:

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

要将
(纬度、经度)
数据导入数据库的geometry列,需要分两步进行处理

1.将数据导入两个浮动列
纬度
经度

UPDATE landmarks SET geom = ST_SetSRID(ST_MakePoint(longitude,latitude),4326);
从原始表地标:

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 );
添加临时两列
纬度
经度

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.通过从
纬度
经度
创建点几何图形来填充几何图形列:

UPDATE landmarks SET geom = ST_SetSRID(ST_MakePoint(longitude,latitude),4326);
最后,删除临时列:

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

还有另一种方法

  • 谷歌
    pgfutter
    并下载相应版本的可执行文件。适用于windows,但其他版本也可用
  • 确保
    pgfutter
    文件和
    yourdata.csv
    文件位于同一目录中
  • 在终端中设置目录并运行以下代码
  • 这也将创建一个新表,因此只需输入一个新的表名

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

  • 还有另一种方法

  • 谷歌
    pgfutter
    并下载相应版本的可执行文件。适用于windows,但其他版本也可用
  • 确保
    pgfutter
    文件和
    yourdata.csv
    文件位于同一目录中
  • 在终端中设置目录并运行以下代码
  • 这也将创建一个新表,因此只需输入一个新的表名

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

  • 错误:整数的输入语法无效:“51.51923”将字符串值指定给整数列时将发生此错误。请您检查一下纬度和经度的csv文件中的数据是如何在命令行中以od读取的,该值以字符5 1的形式存储。5 1 9 2 3,错误:整数的输入语法无效:“51.51923”将字符串值指定给整数列时将发生此错误。请您检查一下纬度和经度的csv文件中的数据是如何在命令行中以od读取的,该值以字符5 1的形式存储。5 1 9 2 3 ,