linux - 使用 bash、awk 或 sed 将 CSV 文件模板化为 SQL 文件
问题描述
我将有一个 CSV 文件(例如,ids.csv
),我需要将其 ETL 到 SQL 脚本(例如,update_products.sql
)中。CSV 将是无标题的,由逗号分隔的数字(数据库中的产品 ID)组成,例如:
29294848,29294849,29294850,29294851,29294853,29294857,29294858,29294860,29294861,29294863,29294887,29294888,
29294889,29294890,29294891,29294892,29294895,29294897,29294898,29294899,29294901,29294903,29294912,29294916
从一个如下所示的 SQL“模板”文件 ( )template.sql
开始:
UPDATE products SET quantity = 0 WHERE id = %ID%;
我正在寻找一种通过bash
, awk
, sed
(或任何其他类型的 shell 脚本工具)的方法,以%IDS%
使用 CSV 中的值进行模板化,从而将生成的 SQL 转换为如下内容:
UPDATE products SET quantity = 0 WHERE id = 29294848;
UPDATE products SET quantity = 0 WHERE id = 29294849;
UPDATE products SET quantity = 0 WHERE id = 29294850;
... etc, for all the IDs in the CSV...
这里超级灵活:
- 不在乎哪个工具可以完成工作(
awk
,sed
, bash 等等...只要我可以从命令行运行它) - 不一定需要一个模板文件(
template.sql
)开始,也许解决方案可以将这个模板作为参数“注入”到脚本中 - 理想情况下,它会读取输入的 CSV,但这不是硬性要求,如果解决方案需要我将 CSV 文件的内容作为参数粘贴到脚本中,我可以接受,但并不激动......
- 理想情况下,它会为我生成一个实际的 SQL 文件 (
update_products.sql
),但如果我们仅限于控制台输出,那没关系(只是不推荐)
任何想法我如何能够做到这一点?
解决方案
我可能会从
$: sed "s/ *= %ID%/ IN ( $(echo $(<ids.csv) ) )/" template.sql > update_products.sql
但如果有很多 id,我不确定你的限制是什么,老实说,我不记得这是否是 ANSI 标准结构......
所以...
$: while IFS=, read -a ids
> do for id in ${ids[@]}
> do echo "UPDATE products SET quantity = 0 WHERE id = $id;"
> done
> done < ids.csv > update_products.sql
$: cat update_products.sql
UPDATE products SET quantity = 0 WHERE id = 29294848;
UPDATE products SET quantity = 0 WHERE id = 29294849;
UPDATE products SET quantity = 0 WHERE id = 29294850;
UPDATE products SET quantity = 0 WHERE id = 29294851;
UPDATE products SET quantity = 0 WHERE id = 29294853;
UPDATE products SET quantity = 0 WHERE id = 29294857;
UPDATE products SET quantity = 0 WHERE id = 29294858;
UPDATE products SET quantity = 0 WHERE id = 29294860;
UPDATE products SET quantity = 0 WHERE id = 29294861;
UPDATE products SET quantity = 0 WHERE id = 29294863;
UPDATE products SET quantity = 0 WHERE id = 29294887;
UPDATE products SET quantity = 0 WHERE id = 29294888;
UPDATE products SET quantity = 0 WHERE id = 29294889;
UPDATE products SET quantity = 0 WHERE id = 29294890;
UPDATE products SET quantity = 0 WHERE id = 29294891;
UPDATE products SET quantity = 0 WHERE id = 29294892;
UPDATE products SET quantity = 0 WHERE id = 29294895;
UPDATE products SET quantity = 0 WHERE id = 29294897;
UPDATE products SET quantity = 0 WHERE id = 29294898;
UPDATE products SET quantity = 0 WHERE id = 29294899;
UPDATE products SET quantity = 0 WHERE id = 29294901;
UPDATE products SET quantity = 0 WHERE id = 29294903;
UPDATE products SET quantity = 0 WHERE id = 29294912;
UPDATE products SET quantity = 0 WHERE id = 29294916;
推荐阅读
- express - create-react-app 文件在客户端是否可见?
- c++ - gcc wstring_convert中的错误?
- javascript - html 函数不适用于任何事件
- javascript - 用于 BrowserWindow 事件的 event.preventDefault() 关闭/最小化/最大化在电子中不起作用
- amazon-web-services - 在 AWS 上查找增加的 KMS API 调用的来源
- javascript - 如何使用 React Native 和 Axios 删除帖子并快速刷新
- javascript - 在 PWA 区域添加使用 JS 显示和隐藏类
- kotlin - 带有凌空抽射的异步协程
- css - 在反应中为组件设置样式
- java - Vaadin Notification 阻止对其背后元素的访问