如何在Kettle转换中处理带日期变量子目录的TARGETED.LOG文件?
解决Kettle中动态定位带日期变量子目录下TARGETED.LOG文件的方案
针对你在Kettle转换中要定位report_[DDMMYYYY]子目录下TARGETED.LOG的需求,我给你几个实用的解决方案,都是Kettle里常用的落地做法:
方法1:用「获取文件列表」组件自动匹配(最灵活)
如果不确定具体日期,或者需要扫描所有符合格式的子目录找目标文件,这个方法最靠谱:
- 拖拽「获取文件列表」组件到转换画布
- 设置父目录为
c:\username\kettleworkspace\ - 勾选「包含子目录」选项
- 在「目录名字符串」里填匹配规则:
report_[0-9]{8}(DDMMYYYY是8位数字,这个正则能精准匹配符合格式的子目录) - 在「文件名字符串」里填
TARGETED.LOG,确保只找这个固定文件名 - 运行组件后,会输出所有符合条件的文件完整路径,你可以把这个路径字段传给后续的文件输入组件(比如「文本文件输入」)
- 如果有多个匹配结果,还可以加个「排序记录」组件,按目录的修改时间/创建时间排序,取最新的那条记录
方法2:用JavaScript脚本动态拼接路径(适合已知日期的场景)
如果你已经知道要处理的日期(比如当前日期,或者传入的参数日期),可以用脚本直接生成路径:
- 先在转换的「参数」里定义一个日期变量(比如
TARGET_DATE,格式要求是DDMMYYYY),或者直接用当前日期生成:
// 生成当前日期的DDMMYYYY格式字符串 var now = new Date(); var day = String(now.getDate()).padStart(2, '0'); var month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始,记得+1 var year = now.getFullYear(); var dateStr = day + month + year; // 拼接完整路径,注意反斜杠要转义或者用正斜杠 var targetPath = "c:\\username\\kettleworkspace\\report_" + dateStr + "\\TARGETED.LOG"; // 或者用正斜杠更省心:c:/username/kettleworkspace/report_${dateStr}/TARGETED.LOG // 把路径存到Kettle变量里,方便后续组件调用 parent.setVariable("TARGET_FILE_PATH", targetPath);
- 在后续的文件输入组件中,直接使用
${TARGET_FILE_PATH}作为文件路径即可
方法3:变量替换+「文件存在」组件验证
如果已经有现成的日期变量,直接用变量替换构造路径,再验证文件是否存在:
- 定义变量
DDMMYYYY(值为目标日期的8位字符串) - 构造路径为
c:\username\kettleworkspace\report_${DDMMYYYY}\TARGETED.LOG - 添加「文件存在」组件,把上述路径作为输入,检查文件是否存在
- 如果存在,继续后续处理;如果不存在,可以抛出错误或者走异常分支处理
小提示
- Kettle里路径的反斜杠需要转义(用两个反斜杠
\\),或者直接用正斜杠/,两种写法都能识别 - 如果是处理历史日期,推荐用方法2或3,提前传入日期参数更高效;如果需要扫描所有可能的日期目录,方法1是最优解
内容的提问来源于stack exchange,提问作者mokolop
相关产品推荐
相关产品推荐

