同时使用AWK和PostgreSQL的COPY FROM PROGRAM

问题描述 投票:2回答:2

我有一个.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。我用不同的定界符尝试了各种不同的变体,但是我无法终生弄清楚我要去哪里。我是否误解了“从程序复制”可以做什么?还是我错过了什么?

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

sql postgresql awk postgresql-9.5 postgresql-copy
2个回答
2
投票

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

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

1
投票

在awk中,退出代码2可能意味着它无法打开输入文件。这很有意义,因为COPY在服务器进程的当前工作目录中(可能不在文件所在的位置)在服务器端寻找文件。请改用\ copy在psql的当前工作目录中查找文件。由awk生成的实际错误消息应该在数据库服务器的日志文件中找到(与COPY一起使用时;与\ copy一起使用时,它应该显示在psql的stderr上)。

© www.soinside.com 2019 - 2024. All rights reserved.