调色板上有一个 tFTPFileList 组件。这应该会为您提供 FTP 位置上所有文件的列表。然后,您想从这里解析出时间戳,这可以使用正则表达式完成,或者根据您觉得更舒服的方式对其进行子字符串化。
然后它只是按提取的时间戳排序的情况,然后为您提供最新的文件名,以便您可以获取该特定文件。
这里概述了完成这项工作的一种过于费力的方法,但它确实有效。您也应该能够自己轻松地调整它:
在上面的工作设计中,我选择了 tFileList 而不是 tFTPFileList,因为我在这里没有可用于测试的示例 FTP 位置。前提保持不变,尽管这对于真正的 tFileList 毫无意义,因为它能够按修改日期排序(以及其他选项)。
我们首先运行 tFileList/tFTPFileList 组件来遍历该位置中的所有文件(也可以对这些文件进行文件掩码以限制您在此处返回的内容)。然后我们以迭代方式将其读取到 tFixedFlowInput 组件中,当 tFileList/tFTPFileList 遍历每个文件时,该组件允许我们从 globalMap 中检索值:
我已经列出了 tFileList 提供的所有内容(您可以通过按 ctrl+space 查看选项),但您只需要文件名以及可能的文件路径或文件目录。然后,我们从这里将所有内容放入带有 tBufferOutput 组件的缓冲区中,以便我们可以收集位置的每次迭代。
一旦 tFileList/tFTPFileList 遍历目录中的每个文件,它就会触发带有 OnSubjobOk 链接的下一个子作业,我们首先使用 tBufferInput 组件将完成的缓冲区读回。此时,我已经开始在整个流程中分散 tLogRow 组件,以便更好地可视化每一步的数据。
之后,我们使用 tExtractRegexFields 组件从文件名中提取日期时间戳:
在这里,我使用以下正则表达式"^.+?_Outbound_([0-9]{12})\\.xml$" 来捕获日期时间戳。它依赖于文件名是任意字符的组合,后跟字符串文字 _Outbound_,然后是我们要捕获的日期时间戳(由 12 个数字字符表示),然后以 .xml 结束.
我们还在架构中添加一列以容纳捕获的日期时间戳,如下所示:
由于额外的列是yyyyMMddhhmm 形式的日期时间戳,我们可以在此处直接指定它,然后将其用作日期对象。
从这里我们只需按日期降序对提取的日期时间戳列进行排序,然后根据组件配置指南使用 tSampleRow 仅获取数据流的第一行。
要完成这项工作,您需要将目标文件路径输出到 globalMap(在 tJavaRow 中或使用会自动为您执行此操作的 tFlowToIterate),然后在 tFTPFileGet 的文件掩码设置中使用 globalMap 存储的文件路径: