比较 PDI 中的文件名

Posted

技术标签:

【中文标题】比较 PDI 中的文件名【英文标题】:Comparing filenames in PDI 【发布时间】:2015-05-21 07:18:50 【问题描述】:

我正在尝试使用 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】:

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

    Get filenames 列出特定文件夹中与给定模式匹配的所有文件。由于$KeyDate 已经被定义为参数,所以模式可以是

    $KeyDate[^]_[0-9].csv

(您可以使用更简单的正则表达式,但这个只会匹配该格式的文件名;

    通过正则表达式评估,您将获得日期:$KeyDate_[^_]*_([0-9]*)\.csv。记得勾选“为捕获组创建字段”复选框; 按新创建的日期字段对行进行排序。 分组方式(不带关键字段)并取文件名的第一个值(如果按 asc 顺序)或最后一个值(如果按 desc 顺序)。

Group by step 的输出是单行,其中包含与您的模式匹配的最新文件名。

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

【讨论】:

以上是关于比较 PDI 中的文件名的主要内容,如果未能解决你的问题,请参考以下文章

您可以在 Pentaho 数据集成 (PDI) 中动态设置固定文件输入列定义吗?

pentaho 勺子/PDI:如何创建具有当前日期的文件夹?

在 PDI / Spoon 中复制/移动文件会产生“不是文件”错误

PDI(Pentaho Kettle)Jar 文件的 Maven 依赖项

Pentaho PDI/Kettle 从文本文件中读取多行

PDI 水壶 - 数据查找和附加值