【问题标题】:import csv file into postgres table based on some key根据某些键将 csv 文件导入 postgres 表
【发布时间】:2020-05-20 05:08:13
【问题描述】:

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

在我的 postgres sql 中,我有一个名为“Person”的表,它有 8 列,包括“名称”和“详细信息”。

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

即基于key匹配,key为name,value为details。

还有其他方法吗。

【问题讨论】:

  • 导入临时表,然后在SQL中做逻辑

标签: postgresql csv


【解决方案1】:

我建议创建一个临时表,然后使用简单的更新查询从那里填充 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)

【讨论】:

    【解决方案2】:

    如果我理解你,你的表格有 > 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;
    

    【讨论】:

    • 是的,你是对的,但我的问题是当人员表的名称与 CSV 文件中的名称匹配时,CSV 文件中该名称的详细信息应转储到人员表详细信息列中,否则不应该。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    相关资源
    最近更新 更多