Postgresql 使用附加数据复制csv文件

Postgresql 使用附加数据复制csv文件,postgresql,csv,libpqxx,postgresql-copy,Postgresql,Csv,Libpqxx,Postgresql Copy,我有下表: persons(id,id_tech,name,nationality,id_list) 以及一个CSV文件,其中包含列id、名称和国籍的数据 这样导入数据是可行的: \copy persons(id_tech,name,nationality) FROM '/path/to/file.csv' DELIMITER ',' CSV id\u列表值不在CSV文件中,因为该文件必须在许多服务器上导入,而这些服务器上该id的值可能不同 是否有方法在为特定列提供附加值的同时导入CSV文件

我有下表:

persons(id,id_tech,name,nationality,id_list)
以及一个CSV文件,其中包含列id、名称和国籍的数据

这样导入数据是可行的:

\copy persons(id_tech,name,nationality) FROM '/path/to/file.csv' DELIMITER ',' CSV
id\u列表
值不在CSV文件中,因为该文件必须在许多服务器上导入,而这些服务器上该id的值可能不同

是否有方法在为特定列提供附加值的同时导入CSV文件?我在文件上找不到任何相关的东西

编辑--
请注意,我的所有命令将用PQXX在C++(多平台)中执行。我试图避免编辑文件,因为它的大小

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

  • 为我需要的字段创建一个具有正确默认值的临时表
  • 将文件导入此临时表
  • 将tmp复制到最终表
  • 移除临时表
但我不确定它的性能。最大的进口可能接近500K线路


谢谢在Linux上,您可以使用awk将附加值字段添加到数据中,并使用psql从stdin读取:

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

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

(在PostgreSQL 12.4上进行了测试)

找到了一个似乎非常合适的解决方案

正如在我的OP中所述,我使用libpqxx插入数据,因此我不直接运行复制sql请求,而是使用

如果需要,允许我添加附加字段:

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();
pqxx::流到流(w,mTable,std::vector{“id\u tech”,“name”,“national”,“extra\u col”});
csv::CSVReader读取器(文件路径);
用于(csv::CSVRow&row:读卡器){

流感谢你的回答,但是我不仅在Linux下与C++中的PrxGrice交互,我可以修改C++中的文件,但是由于它们的大小,我希望避免你不能从STDIN读取,需要从文件中读取,我想你必须先编辑文件,然后再加载到一个分步表中。祝你好运。