繁体   English   中英

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

[英]FTP using Talend, get only most recent file?

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

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

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

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

然后,这只是一个按提取的时间戳排序然后为您提供最新文件名的情况,以便您可以获取该特定文件。

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

作业布局示例

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

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

使用tFixedFlowInput组件从globalMap检索值

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

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

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

该图显示了tExtractRegexFields组件的配置

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

我们还在我们的模式中添加一列以适应捕获的日期时间戳,如下所示:

tExtractRegexFields组件的模式

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

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

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

使用tFlowToIterate和tFTPGet配置将数据放入globalMap

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM