PDI - 基于文件名中的日期的多个文件输入

时间:2018-04-19 07:39:15

标签: kettle pentaho-data-integration pdi

我正在使用Kettle(PDI)开展项目。 我必须输入多个.csv或.xls文件并将其插入DB。

文件名是AAMMDDBBBB,其中AA是城市的代码,BBBB是商店的代码。 MMDD是日期格式,如MM-DD。例如LA0326F5CA.csv。

我在输入文件步骤中使用的Regexp看起来像LA.\*\\.csvDT.*\\.xls,它返回所有文件以将其插入到数据库中。

您能指出我如何选择昨天的文件(基于文件名的MMDD)。

2 个答案:

答案 0 :(得分:0)

因为你需要一些"复杂的"在您选择的逻辑中,您不能仅基于正则表达式进行过滤。我建议您先读取所有文件名,然后根据" age"过滤文件名,然后根据所选文件名读取文件。

详细说明:

  1. Get File Names步骤与当前使用的相同正则表达式LA.*\.csvDT.*\.xls)一起使用。使用像LA \ d \ d \ d \ d ...... csv这样的Regexp,你可能会在那个阶段更加严格,以确保MM和DD是数字,而DDDD恰好是4个字符。

  2. 根据日期过滤。您可以使用Java Filter执行此操作,但使用Javascript Script计算" age"会更容易一个数量级。你的文件,然后使用Filter rows只保留昨天的文件。

    要计算文件的年龄,请提取MM和DD,您可以使用(其他方法可用):

    
    
    var regexp = filename.match(/..(\d\d)(\d\d).*/);
    if(regexp){
        var age = new Date() - new Date(2018, regexp[1], regexp[2]);
        age = age /1000 /60 /60 /24;
        };
    
    
    

  3.   

    如果您不熟悉Javascript regexp:匹配将进行测试   针对正则表达式的文件名并保留括号的值   在数组中。如果测试成功(必须明确检查)   避免运行时失败),使用匹配的值来计算   相应的日期,并减去今天的日期以获得年龄。   此年龄以毫秒为单位,以天为单位进行转换。

    1. Text File InputExcel InputAccept file from previous step选项一起使用。请注意,CSV Input没有此选项,但功能更强大的Text File Input有。

答案 1 :(得分:0)

我改进了Java Filter with Modified Java Script Value,现在工作正常。 另一个问题是,如何提高当前转换的性能和速度(现在我有2个城市的2个转换)?我的插入更新使我的变形变慢,需要差不多1小时和30分钟来处理500k行数据,有很多字段(300mb)和我的数据不仅如此,如果它工作得更快,我的公司喜欢用它,我要去用10TB的数据/年和它的大量的trans和行来做。我需要消化它

相关问题