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

5lwkijsr  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(104)

我有下表:

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

以及包含id_tech、name和nationality列数据的CSV文件。
像这样导入数据是有效的:

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

id_list值不在CSV文件中,因为必须在许多服务器上导入该文件,而这些服务器的id值可能不同。
是否有方法在为特定列提供附加值的同时导入CSV文件?我在文件上找不到任何相关信息。
编辑1-
请注意,我的所有命令都将在C++(多平台)中使用pqxx执行。由于文件太大,我尽量避免编辑它。
编辑2 --
我正在考虑以下方法:

  • 为我需要的字段创建一个具有正确默认值的临时表
  • 将文件导入到此临时表
  • 将临时表复制到最终表
  • 删除临时表

但我不确定你的表演。最大的导入量可以接近50万行。

a1o7rhls

a1o7rhls1#

在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上测试)

iyfamqjs

iyfamqjs2#

找到了一个解决方案,似乎比好。
如我的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();

大约需要10秒来导入300K行,这对我的需要很好。

相关问题