我有一个Talend作业,我需要从sFTP服务器下载XML文件,然后再处理成Oracle数据库。 XML提取的日期在文件名中,例如" FileNameHere_Outbound_201407092215.xml",我认为是yyyyMMddhhmm格式化。开头部分" FileNameHere"对于所有文件都是相同的。我需要能够从文件名末尾读取日期,并且只从服务器中取出该日期以进行处理。
我不知道如何使用FTP执行此操作。我之前使用过tFilelist按日期降序排序,但这不是FTP的选项。我知道它可能有一些Java涉及如何拉出文件名的部分,但我不是很懂Java。我可以通过一些帮助来管理。
有没有人知道如何只从FTP下载最新的文件?
答案 0 :(得分:8)
调色板上有一个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个数字字符表示),然后以{结束{1}}。
我们还在架构中添加了一列以容纳捕获的日期时间戳,如下所示:
由于额外列是.xml
形式的日期时间戳,我们可以直接在此处指定,并将其用作日期对象。
从这里开始,我们只需按提取的日期时间戳列中的日期降序进行排序,然后使用tSampleRow根据组件配置的指南仅采用数据流的第一行。
要完成此作业,您可以将目标文件路径输出到globalMap(在tJavaRow中或使用将自动为您执行此操作的tFlowToIterate),然后在tFTPFileGet中使用globalMap存储文件路径文件掩码设置: