FTP使用Talend,只获取最新文件?

时间:2014-07-15 15:21:40

标签: java string ftp etl talend

我有一个Talend作业,我需要从sFTP服务器下载XML文件,然后再处理成Oracle数据库。 XML提取的日期在文件名中,例如" FileNameHere_Outbound_201407092215.xml",我认为是yyyyMMddhhmm格式化。开头部分" FileNameHere"对于所有文件都是相同的。我需要能够从文件名末尾读取日期,并且只从服务器中取出该日期以进行处理。

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

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

1 个答案:

答案 0 :(得分:8)

调色板上有一个tFTPFileList组件。这应该为您提供FTP位置上所有文件的列表。从这里开始,您需要解析可以使用正则表达式完成的时间戳,或者根据您感觉更舒服的方式对其进行子串解。

然后它只是通过提取的时间戳进行排序然后为您提供最新的文件名,以便您可以获取该特定文件。

这里有一个过于费力的方法来完成这项工作,但它有效。你也应该能够轻松地调整它:

Example job layout

在上面的工作设计中,我已经选择了tFileList而不是tFTPFileList,因为我没有一个示例FTP位置可以在这里进行测试。前提保持不变,尽管由于能够按修改日期(以及其他选项)进行排序,这对真正的tFileList来说毫无意义。

我们首先运行tFileList / tFTPFileList组件来遍历所有文件(它们可以对这些文件进行掩码,以限制你在这里返回的内容)。然后我们迭代地将它读到tFixedFlowInput组件,它允许我们在tFileList / tFTPFileList遍历每个文件时从globalMap中检索值:

Use a tFixedFlowInput component to retrieve the values from the globalMap

我列出了tFileList提供的所有内容(您可以通过按ctrl+space查看选项),但您只需要文件名,可能还需要文件路径或文件目录。然后我们将所有内容放入一个带有tBufferOutput组件的缓冲区中,以便我们可以收集该位置的每次迭代。

一旦tFileList / tFTPFileList迭代了目录中的每个文件,它就会触发下一个带有OnSubjobOk链接的子作业,我们首先用tBufferInput组件读回已完成的缓冲区。此时我已经开始在整个流程中散布tLogRow组件,这样我就可以更好地可视化每一步的数据。

然后我们使用tExtractRegexFields组件从文件名中提取日期时间戳:

Image showing the configuration of the tExtractRegexFields component

在这里,我使用以下正则表达式"^.+?_Outbound_([0-9]{12})\\.xml$"来捕获日期时间戳。它依赖于文件名是任何字符的组合,后跟字符串文字_Outbound_,然后是我们想要捕获的日期时间戳(由12个数字字符表示),然后以{结束{1}}。

我们还在架构中添加了一列以容纳捕获的日期时间戳,如下所示:

Schema for tExtractRegexFields component

由于额外列是.xml形式的日期时间戳,我们可以直接在此处指定,并将其用作日期对象。

从这里开始,我们只需按提取的日期时间戳列中的日期降序进行排序,然后使用tSampleRow根据组件配置的指南仅采用数据流的第一行。

要完成此作业,您可以将目标文件路径输出到globalMap(在tJavaRow中或使用将自动为您执行此操作的tFlowToIterate),然后在tFTPFileGet中使用globalMap存储文件路径文件掩码设置:

Putting the data in the globalMap with a tFlowToIterate and tFTPGet Configuration