kettle通过shell脚本+7-zip命令行解压缩文件

在利用kettle做数据入库时,部分文件数据源是压缩过的(一般是.zip或.gz),kettle是自带解压缩组件的,可以直接解压缩。

组件:作业>文件管理>解压缩文件

kettle的解压缩组件,支持多种格式,支持正则表达式

实际应用时发现,部分数据源虽然后缀一样(.gz),但因未知原因用kettle的解压缩会失败报错,但手工用第3方压缩软件是可以解压缩的。

但总不能手工去解压缩吧,就无法做到流程自动化了。研究发现这里可以利用第3方压缩软件(推荐7-Zip)的命令行模式+kettle的shell组件来实现解压缩的流程自动化。

7-Zip

https://www.7-zip.org/

7-Zip是一款完全免费而且开源的压缩软件,有较高的压缩比而且相对WinRAR节省资源。因支持命令行模式,可以作为组件嵌入自动化流程中。

下载安装后,将其安装路径加入环境变量Path中,即可直接在CMD命令行中调用7-zip

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的安装路径,下图配置项的工作路径可忽略,若无则必须填写其安装路径。

指定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命令行解压缩文件

赞 (86)

评论 5

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. 超人哎为什么Keete执行bat脚本,说找不到脚本里面解压的文件?回复
    • Qianrong是没有找到BAT脚本还是没有找到要解压的文件?回复
    • Qianrong可以先手工跑BAT脚本,跑通了再用kettle调用.可以改成绝对路径试试回复
      • 超人哎手工跑BAT脚本和cmd都可以跑,就是kettle上总是说找不到脚本里面的解压文件?不知道是kettle哪里有问题?回复
        • 超人哎谢谢大佬,改成绝对路径可以了。回复