在利用kettle做数据入库时,部分文件数据源是压缩过的(一般是.zip或.gz),kettle是自带解压缩组件的,可以直接解压缩。
组件:作业>文件管理>解压缩文件
实际应用时发现,部分数据源虽然后缀一样(.gz),但因未知原因用kettle的解压缩会失败报错,但手工用第3方压缩软件是可以解压缩的。
但总不能手工去解压缩吧,就无法做到流程自动化了。研究发现这里可以利用第3方压缩软件(推荐7-Zip)的命令行模式+kettle的shell组件来实现解压缩的流程自动化。
7-Zip
7-Zip是一款完全免费而且开源的压缩软件,有较高的压缩比而且相对WinRAR节省资源。因支持命令行模式,可以作为组件嵌入自动化流程中。
下载安装后,将其安装路径加入环境变量Path中,即可直接在CMD命令行中调用7-zip
代码示例:将D:\FTP\MA\wx_hitlogs\ 文件夹下的所有.gz文化解压缩到 D:\FTP\MA\wx_hitlogs 文件夹,模式为覆盖
7z x D:\FTP\MA\wx_hitlogs\*.gz -oD:\FTP\MA\wx_hitlogs -aoa
将命令行保存为.bat批处理文件,如 uznzip.bat,即可直接调用
具体命令行语法可以参考帮助或网上资料,如
https://www.cnblogs.com/qanholas/archive/2011/10/03/2198487.html
嵌入kettle
Kettle中组件:作业>脚本>shell
如下图,指定脚本文件和工作路径(工作软件的安装路径)
如果已经在环境变量path中配置了7-zip的安装路径,下图配置项的工作路径可忽略,若无则必须填写其安装路径。
执行效果
shell组件的其他应用
Shell脚本这个组件用处还是很大的,可以调用其他第3方软件的命令行完成kettle本身无法直接处理的任务。之前还处理过另外一个案例,某第3方自动生成并发送的excel文件,无法利用kettle的 [Apache POI Streaming]模式(流模式读取excel并入库,效率更高且内存不会爆掉可以流畅处理上百万行的excel),但保存一下就可以读取了……
于是想到如何将excel打开再保存的任务自动化,发现MS自带的VBS可以处理。
语法如下
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open ("E:\PDI_input\data_20200801.xlsx")
objExcel.Workbooks(1).Save 'Open Workbooks
objExcel.Workbooks(1).Close 'Close Workbooks
objExcel.Quit ' Quit
保存成.vbs文件即可执行。这里的文件路径和文件名可以用js组件自动生成。
以上即完成了.vbs文件的自动动态生成,再嵌入kettle流程中(shell组件调用)即可实现excel文件的自动打开并保存。
尊重作者劳动,转载请注明出处:札记-Qianrong's Blog » kettle通过shell脚本+7-zip命令行解压缩文件