来自/ import的Postgres CSV COPY不符合CSV标题

Jon*_*Ong 8 csv postgresql

我正在尝试将CS​​V中的数据导入到表中.问题在于,即使使用CSV HEADER,也会根据列索引导入CSV,而不是在该列的标题上导入.

CREATE TABLE denominations (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100) NOT NULL
);

CREATE TABLE churches (
  id SERIAL PRIMARY KEY,
  -- NOT relevant here
  address_id INTEGER REFERENCES addresses,
  denomination_id INTEGER NOT NULL REFERENCES denominations,
  name VARCHAR(100) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

我的CSV看起来像:

id,name
1,Southern Baptist Convention
2,Nondenominational
3,Catholic
4,Presbyterian


id,denomination_id,name,address_id
1,1,Saddleback Church,
2,4,First Presbyterian Church,
3,3,St. Elizabeth's Church,
4,3,St Monica Catholic Community,
5,2,Modern Day Saints Church,
6,4,Second Presbyterian Church,
Run Code Online (Sandbox Code Playgroud)

我的COPY命令在bash中看起来像这样:

psql -d vacation -c "COPY denominations FROM '$PWD/data/Data - Denominations.csv' WITH DELIMITER ',' CSV HEADER;"
psql -d vacation -c "COPY churches FROM '$PWD/data/Data - Churches.csv' WITH DELIMITER ',' CSV HEADER;"
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

ERROR:  invalid input syntax for integer: "Saddleback Church"
CONTEXT:  COPY churches, line 2, column denomination_id: "Saddleback Church"
Run Code Online (Sandbox Code Playgroud)

现在,我要重新排列CSV中的列,但这不应该有效吗?

Pat*_*ick 10

COPY默认情况下,该命令按照表中列的默认顺序从CSV文件中复制列.输入上HEADER选项被忽略,它基本上只通知后端忽略输入的第一行.如果CSV中列的顺序与表中列的顺序不匹配,则可以显式指定列顺序以匹配CSV文件的布局:

COPY churches (id,denomination_id,name,address_id)
FROM '$PWD/data/Data - Churches.csv'
WITH DELIMITER ',' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)

  • 在`COPY`命令中有很多改进空间,自动标题识别会很好.据我所知,没有人在研究它.大多数需要做更好的东西的人都使用ETL工具. (4认同)
  • 呵呵。该死的。希望它更自动化。谢谢 (2认同)
  • 嗯,这看起来像我一样多才多艺.只需将标题行复制到`COPY`命令即可.任何体面的语言,甚至是手工都很容易. (2认同)

Chr*_*bbs 8

以下是使用 csv 标题行导入用户的单行示例:

echo "\copy users ($(head -1 users.csv)) FROM 'users.csv' DELIMITER ',' CSV HEADER" | psql
Run Code Online (Sandbox Code Playgroud)

或者使用 gzip:

echo "\copy users ($(gzip -dc users.csv.gz | head -1)) FROM PROGRAM 'gzip -dc users.csv.gz' DELIMITER ',' CSV HEADER" | psql
Run Code Online (Sandbox Code Playgroud)