比较PDI中的文件名

时间:2015-05-21 07:18:51

标签: pentaho etl kettle data-integration pdi

我正在尝试使用PDI(Kettle)将某个.CSV文件导入我的数据库。

通常情况下这很容易,因为您只需将CSV file input步骤与Table output步骤相关联即可。但问题是,我不知道要提前导入哪个文件,就像在PDI中执行作业/转换之前一样。

那是因为我的导入文件夹中有很多文件,它们的文件名格式都相同:KeyDate_Filename_YYYYMMDD.CSV

我们的想法是在给定的关键日期导入最新的YYYYMMDD文件。

我实现这一目标的理论方法是:

  • 将PDI中的给定关键日期作为参数(已完成)
  • 读入导入文件夹中存储的所有文件的名称
  • 过滤指定关键日期的文件名
  • 比较剩余文件的YYYYMMDD并选择最新的
  • CSV file input步骤(已完成)中使用所选文件名作为参数
  • 通过Table output步骤(已完成)导入数据

不幸的是,我对PDI相当陌生,对于如何实施大胆的部分,或者整个方法是否可行,我真的没有一个令人信服的想法。

有人可以想办法完成这项工作吗?感谢任何反馈

编辑:忘记提及我使用的是PDI 3.2.6。

在4.x.x中,我可以简单地使用用户定义的Java类来完成此任务:/

1 个答案:

答案 0 :(得分:4)

有多种方法可以实现这一结果。这是一个:

enter image description here

  1. 获取文件名列出特定文件夹中与给定模式匹配的所有文件。由于${KeyDate}已被定义为参数,因此模式可以是

    $ {KEYDATE} [^ _ [0-9] 的.csv

  2. (你可以使用更简单的正则表达式,但这个只能匹配那种格式的文件名;

    1. 通过正则表达式评估,您可以获得日期:${KeyDate}_[^_]*_([0-9]*)\.csv。请记住勾选“为捕获组创建字段”复选框;
    2. 按新创建的日期字段排序行。
    3. 分组(没有关键字段)并获取文件名的第一个值(如果是asc顺序)或最后一个值(如果是desc顺序)。
    4. Group by step的输出是一行,其最新文件名与您的模式匹配。

      现在您将其传递给CSV文件输入,告诉它“接受上一步骤中的文件名”,并指定要使用的字段(默认为文件名)。