复制带有附加数据的 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 --
我正在考虑以下方法:
- 为我需要的字段创建一个具有正确默认值的临时文件table
- 将文件导入此临时文件 table
- 将 tmp 复制到最终文件 table
- 删除温度 table
但我不确定性能。最大的导入可以接近 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 秒,这完全符合我的需要。
我有以下 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 --
我正在考虑以下方法:
- 为我需要的字段创建一个具有正确默认值的临时文件table
- 将文件导入此临时文件 table
- 将 tmp 复制到最终文件 table
- 删除温度 table
但我不确定性能。最大的导入可以接近 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 秒,这完全符合我的需要。