【问题标题】:FTP using Talend, get only most recent file?使用 Talend 的 FTP,只获取最近的文件?
【发布时间】:2014-07-15 15:21:39
【问题描述】:

我有一个 Talend 工作,我需要从 sFTP 服务器下载一个 XML 文件,然后将其处理到 Oracle 数据库中。 XML 提取的日期在文件名中,例如“FileNameHere_Outbound_201407092215.xml”,我相信它是 yyyyMMddhhmm 格式。所有文件的“FileNameHere”开头部分都相同。我需要能够从文件名的末尾读取日期,并且只从服务器中拉出那个日期以进行处理。

我不确定如何使用 FTP 来执行此操作。我以前使用 tFilelist 按日期降序对项目进行排序,但这不是 FTP 的选项。我知道它可能有一些 Java 涉及如何提取文件名的一部分,但我不是很懂 Java。我可以通过一些帮助来管理。

有没有人知道如何只从 FTP 下载最新的文件?

【问题讨论】:

  • 您可以按修改日期订购,有时就足够了

标签: java string ftp etl talend


【解决方案1】:

调色板上有一个 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 存储的文件路径:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    相关资源
    最近更新 更多