我想导入一个CSV文件,该文件只有两列作为“名称”和“详细信息”。
在我的postgres sql中,我有一个名为“ Person”的表,该表有8列,其中包括“ name”和“ details”。
现在我想要的是将csv文件导入Person表,并且当csv的name列与Person name列匹配时,它应该将details列导入Person。
这是基于键匹配的,键是名称,值是详细信息。
还有其他可能的方法吗?
答案 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)