复制带有附加数据的 csv 文件

COPY csv file with additionnal datas

我有以下 table :

persons(id,id_tech,name,nationality,id_list)

还有一个 CSV 文件,其中包含列 id_tech、姓名和国籍的数据。

像这样导入数据是有效的:

\copy persons(id_tech,name,nationality) FROM '/path/to/file.csv' DELIMITER ',' CSV

id_list 值不在 CSV 文件中,因为该文件必须在许多服务器上导入,此 ID 的值可能不同。

有没有办法在为特定列提供附加值的同时导入 CSV 文件?我在文档中找不到任何相关内容。

编辑--
请注意,我的所有命令都将在 C++(多平台)中使用 pqxx 执行。由于文件的大小,我试图避免对其进行编辑。

编辑 2 --
我正在考虑以下方法:

但我不确定性能。最大的导入可以接近 500K 行。

谢谢

在 Linux 上,您可以使用例如 awk 将附加值字段添加到您的数据中,并使用 psql 从标准输入读取:

$ cat copy.sql
\copy persons(id_tech,name,nationality,extra_col) FROM '/dev/stdin' DELIMITER ',' CSV

然后:

$ awk '
BEGIN {
    FS=OFS=","
}
{
    print ,,,"additional value"
}' file.csv | psql -h host -d database -f file.sql

(在 PostgreSQL 12.4 上测试)

找到了一个看起来还不错的解决方案。

如我的 OP 所述,我使用 libpqxx 插入数据,因此我没有直接使用 运行 COPY sql 请求,而是简单地使用 pqxx::stream_to

这允许我在需要时添加附加字段:

pqxx::stream_to stream(w, mTable, std::vector<std::string>{"id_tech","name","nationality","extra_col"});
csv::CSVReader reader(filePath);
for (csv::CSVRow& row : reader) {

    stream << std::make_tuple(row[0].get<long long>(), row[1].get<std::string>(), row[2].get<std::string>(), custom_id);
}
stream.complete();

导入 300K 行大约需要 10 秒,这完全符合我的需要。