根据某些键将csv文件导入postgres表

时间:2020-02-04 11:19:26

标签: postgresql csv

我想导入一个CSV文件,该文件只有两列作为“名称”和“详细信息”。

在我的postgres sql中,我有一个名为“ Person”的表,该表有8列,其中包括“ name”和“ details”。

现在我想要的是将csv文件导入Person表,并且当csv的name列与Person name列匹配时,它应该将details列导入Person。

这是基于键匹配的,键是名称,值是详细信息。

还有其他可能的方法吗?

2 个答案:

答案 0 :(得分:0)

如果我了解您的情况,您的表格有> 2个字段,但是您的CSV文件只有两个字段,因此如下:

create table person (
  blah
  blah
  name text,
  details text,
  blah
  blah
)

person.csv:

name,details
Hambone,Where Ya Been?
Luke,Skywalker

在这种情况下,您可以在copy命令中指定字段:

copy person (name, details)
from '/var/tmp/person.csv'
with null as '' csv header;

答案 1 :(得分:0)

我建议创建一个临时表,然后在其中用简单的更新查询填充person表。

数据样本

CREATE TABLE public.person(
  name text,
  details text,
  something_else text);

INSERT INTO person (name) VALUES 
('foo'),('bar');

CREATE TABLE public.tmp_person(
  name text,
  details text);

CSV文件内容:

name, details
foo, det1
bar, det2

将csv文件导入tmp_person,例如通过psql

$ cat file.csv | psql -d mydb -U myuser -c "COPY tmp_person FROM STDIN CSV HEADER"

然后更新您的person表:

UPDATE person SET details = tmp.details
FROM tmp_person tmp WHERE tmp.name = person.name;

最后,表person将具有csv文件中的details,因此您可能想使用DROP TABLE tmp_person

SELECT * FROM person;
 name | details | something_else 
------+---------+----------------
 foo  |  det1   | 
 bar  |  det2   | 
(2 Zeilen)