sql - 一起使用 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 实际上是一种非常酷的方法,但我无法让它工作。
解决方案
如果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
;-)
推荐阅读
- powerbi - LUIS 聊天机器人与 Power BI 的集成
- excel - 有没有办法通过 excel vba 检查外部宏显示的 msgbox 的内容?
- c# - 如何构建具有自定义结构的 TreeView 节点?
- php - Laravel 为什么用户收到相同的电子邮件
- reactjs - 如何查看 webpack 以编程方式生成的代码以搜索 Component、useState 或 render 等字符串?
- svg - 如何在Angular中调整svg的大小?
- drop-down-menu - 在python中使用破折号的默认下拉菜单
- jenkins - WebDriverIO 没有这样的元素:无法找到元素
- python - 如何计算两条线之间的交点,其中一条由数据框列定义
- elasticsearch - Kafka Mysql CDC 到弹性搜索