PDI(Kettle)基于文件名日期筛选昨日批量文件的实现方法
解决Kettle(PDI)筛选昨日日期文件的方案
这问题我之前帮不少人解决过,核心是要动态生成昨日的MMDD格式字符串,然后把它融入到Kettle的文件匹配规则里,而不是用固定的正则硬匹配。下面给你具体的实现步骤:
1. 生成昨日的MMDD格式变量
首先你需要在Kettle中生成一个存储昨日日期(MMDD格式)的变量,这里推荐两种常用方法:
方法一:使用JavaScript步骤(灵活可控)
在转换中添加一个JavaScript步骤,写入以下代码来计算昨日的两位月日并设置变量:
// 自定义补零函数(兼容Kettle老版本的JS引擎) function padZero(num) { return num < 10 ? '0' + num : '' + num; } // 计算昨日日期 var yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); // 提取两位月份和日期 var mm = padZero(yesterday.getMonth() + 1); // 月份从0开始,所以加1 var dd = padZero(yesterday.getDate()); var mmdd = mm + dd; // 将结果存入作业变量(如果是转换内使用,可换用setVariable("YESTERDAY_MMDD", mmdd);) parent_job.setVariable("YESTERDAY_MMDD", mmdd);
方法二:使用“获取系统信息”步骤(更简洁)
如果是在作业中操作,可以添加获取系统信息步骤,选择“昨天的日期”,然后设置输出格式为MMdd,并将结果存入变量YESTERDAY_MMDD。
2. 在文件输入步骤中使用变量筛选文件
有了昨日的MMDD变量后,就可以在文件输入步骤的“文件名”匹配规则里动态引用它,精准筛选符合要求的文件:
宽松匹配(兼容所有城市和门店编码)
如果你想匹配所有城市、所有门店且日期为昨日的csv/xls文件,可以用:
- 对于csv文件:
*${YESTERDAY_MMDD}*.csv - 对于xls文件:
*${YESTERDAY_MMDD}*.xls
严格匹配(完全符合你的命名规则AAMMDDBBBB)
如果要严格匹配AA(城市编码)MMDD(日期)BBBB(门店编码).格式的命名规则,用正则表达式结合变量:
^[A-Z]{2}${YESTERDAY_MMDD}[A-Z0-9]{4}\.(csv|xls)$
这个正则会确保:
- 前两位是大写字母(城市编码)
- 中间四位是昨日的MMDD日期
- 后四位是字母数字组合(门店编码)
- 后缀只能是csv或xls
注意事项
- 确保变量的作用域正确:如果是作业级变量,转换中需要勾选“共享变量”才能访问;如果是转换内变量,直接在当前转换内使用即可。
- 测试时可以先把变量值固定成某个已知日期(比如
0326),验证匹配规则是否生效,再切换成动态计算的昨日日期。
内容的提问来源于stack exchange,提问作者user9668308
相关产品推荐
相关产品推荐

