比较 PDI 中的文件名
Comparing filenames in PDI
我正在尝试使用 PDI (Kettle) 将某个 .CSV 文件导入我的数据库。
通常这会很容易,因为您只需 link 上 CSV file input
步和 Table output
步就可以了。但是,问题是我不知道我要提前导入哪个文件,就像在PDI中执行job/transformation之前一样。
那是因为我的导入文件夹中有很多文件,它们的文件名格式都相同:KeyDate_Filename_YYYYMMDD.CSV
我们的想法是为给定的关键日期导入最新的 YYYYMMDD 文件。
我实现这个的理论方法是:
- 将给定的关键日期作为参数在 PDI 中可用(已完成)
- 读取导入文件夹中存储的所有文件的名称
- 过滤给定关键日期的文件名
- 比较剩余文件的 YYYYMMDD 和 select 最新的
- 在
CSV file input
步骤中使用 selected 文件名作为参数(已完成)
- 通过
Table output
步骤导入数据(已完成)
不幸的是,我对 PDI 还很陌生,对于如何实现粗体部分或者该方法作为一个整体是否可行并没有真正令人信服的想法。
谁能想出办法来完成这件事?感谢任何反馈
编辑:忘记提及我使用的是 PDI 3.2.6。
在 4.x.x 中,我可以简单地使用用户定义的 Java Class 来完成此操作:/
有多种方法可以实现该结果。这是一个:
获取文件名列出特定文件夹中与给定模式匹配的所有文件。由于 ${KeyDate}
已定义为参数,因此模式可以是
${KeyDate}[^]_[0-9].csv
(您可以使用更简单的正则表达式,但这个正则表达式将仅匹配该格式的文件名;
- 通过正则表达式评估,您可以获得日期:
${KeyDate}_[^_]*_([0-9]*)\.csv
。记得勾选 "create fields for capture groups" 复选框;
- 按新创建的日期字段对行进行排序。
- 分组依据(没有关键字段)并取文件名的第一个值(如果是 asc 顺序)或最后一个值(如果是 desc 顺序)。
逐步分组的输出是一行,其中包含与您的模式匹配的最新文件名。
现在将它传递给 CSV 文件输入,告诉它 "accept filenames from previous step",并指定要使用的字段(默认为文件名)。
我正在尝试使用 PDI (Kettle) 将某个 .CSV 文件导入我的数据库。
通常这会很容易,因为您只需 link 上 CSV file input
步和 Table output
步就可以了。但是,问题是我不知道我要提前导入哪个文件,就像在PDI中执行job/transformation之前一样。
那是因为我的导入文件夹中有很多文件,它们的文件名格式都相同:KeyDate_Filename_YYYYMMDD.CSV
我们的想法是为给定的关键日期导入最新的 YYYYMMDD 文件。
我实现这个的理论方法是:
- 将给定的关键日期作为参数在 PDI 中可用(已完成)
- 读取导入文件夹中存储的所有文件的名称
- 过滤给定关键日期的文件名
- 比较剩余文件的 YYYYMMDD 和 select 最新的
- 在
CSV file input
步骤中使用 selected 文件名作为参数(已完成) - 通过
Table output
步骤导入数据(已完成)
不幸的是,我对 PDI 还很陌生,对于如何实现粗体部分或者该方法作为一个整体是否可行并没有真正令人信服的想法。
谁能想出办法来完成这件事?感谢任何反馈
编辑:忘记提及我使用的是 PDI 3.2.6。
在 4.x.x 中,我可以简单地使用用户定义的 Java Class 来完成此操作:/
有多种方法可以实现该结果。这是一个:
获取文件名列出特定文件夹中与给定模式匹配的所有文件。由于
${KeyDate}
已定义为参数,因此模式可以是${KeyDate}[^]_[0-9].csv
(您可以使用更简单的正则表达式,但这个正则表达式将仅匹配该格式的文件名;
- 通过正则表达式评估,您可以获得日期:
${KeyDate}_[^_]*_([0-9]*)\.csv
。记得勾选 "create fields for capture groups" 复选框; - 按新创建的日期字段对行进行排序。
- 分组依据(没有关键字段)并取文件名的第一个值(如果是 asc 顺序)或最后一个值(如果是 desc 顺序)。
逐步分组的输出是一行,其中包含与您的模式匹配的最新文件名。
现在将它传递给 CSV 文件输入,告诉它 "accept filenames from previous step",并指定要使用的字段(默认为文件名)。