首页 > 解决方案 > 一起使用 AWK 和 PostgreSQL 的 COPY FROM PROGRAM

问题描述

我有一个由数千行组成的 .dat 文件,其中每行由 4 组数字组成,由::. 它最终看起来像这样:

1234::482::4::1342.5321234
4342::532::1::1532.532431

我正在尝试使用 COPY FROM PROGRAM 将此文件复制到 Postgres 表中。顺便说一句,我正在使用 PostreSQL 9.5。我尝试使用 PROGRAM 选项的原因是因为我只需要每行的前 3 组数字。我发现我可以使用 awk 命令在终端中打印我想要复制的内容, awk -F '::' '{print $1, $2, $3}' my_file.dat所以我想我可以将该 awk 命令传递给 COPY FROM PROGRAM 并将前 3 组数字导入到我的数据库表中,该表只有3列。

但是,当我尝试将此命令与 COPY FROM 一起使用时,我不断收到错误消息。我尝试在 psql 中运行以下命令

COPY my_table FROM PROGRAM 'awk -F ''::'' ''{print $1''%''$2''%''$3}'' my_file.dat' delimiter '%';

但不断收到错误: ERROR: program "awk -F '::' '{print $1'%'$2'%'$3}' my_file.dat" failed DETAIL: child process exited with exit code 2. 我已经用不同的分隔符尝试了各种不同的变体,但我一生都无法弄清楚我哪里出错了。我是否误解了 COPY FROM PROGRAM 可以做什么?还是我错过了什么?

我无法在我的系统上创建新文件,因此无法运行命令来过滤文件并创建具有所需格式的新文件。我需要能够在一行 SQL 代码中编写它,并认为 COPY FROM PROGRAM 实际上是一种非常酷的方法,但我无法让它工作。

标签: sqlpostgresqlawkpostgresql-9.5postgresql-copy

解决方案


如果awk返回正确的结果集,您可以尝试使用STDIN(Standard Input) from导入它,而不是从 PostgreSQL 内部COPY执行,例如awk

awk -F "::" '{print $1"%"$2"%"$3}' ratings_copy.dat | psql -d db "COPY my_table FROM STDIN"

此命令获取 的结果awk并将其通过管道传输到psql,然后可由COPY FROM. 另一种选择是使用\copy;-)


推荐阅读