Java FTP使用Talend,是否仅获取最新文件?

Java FTP使用Talend,是否仅获取最新文件?,java,string,ftp,etl,talend,Java,String,Ftp,Etl,Talend,我有一个Talend工作,我需要从sFTP服务器中提取一个XML文件,然后将其处理到Oracle数据库中。XML提取的日期在文件名中,例如“FileNameHere\u Outbound\u 201407092215.XML”,我认为这是yyyyMMddhhmm格式。所有文件的开头部分“FileNameHere”都相同。我需要能够读取文件名末尾的日期,并且只从要处理的服务器上下拉该日期 我不知道如何使用FTP实现这一点。我以前使用过tFilelist按日期降序对项目进行排序,但这不是FTP的选项

我有一个Talend工作,我需要从sFTP服务器中提取一个XML文件,然后将其处理到Oracle数据库中。XML提取的日期在文件名中,例如“FileNameHere\u Outbound\u 201407092215.XML”,我认为这是yyyyMMddhhmm格式。所有文件的开头部分“FileNameHere”都相同。我需要能够读取文件名末尾的日期,并且只从要处理的服务器上下拉该日期

我不知道如何使用FTP实现这一点。我以前使用过tFilelist按日期降序对项目进行排序,但这不是FTP的选项。我知道在如何提取文件名的部分时可能涉及到一些Java,但我不是很懂Java。不过,只要有一点帮助,我就能应付


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

调色板上有一个tFTPFileList组件。这将为您提供FTP位置上所有文件的列表。然后,您需要从这里解析出时间戳,该时间戳可以使用正则表达式完成,也可以根据您觉得更适合使用的时间戳进行替换

然后,它只是一个按提取的时间戳排序的例子,然后它会给您最新的文件名,这样您就可以获取特定的文件

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

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

我们首先运行tFileList/tFTPFileList组件来迭代该位置中的所有文件(也可以对这些文件进行文件屏蔽,以限制返回的内容)。然后,我们将其以迭代方式读入tFixedFlowInput组件,该组件允许我们在tFileList/tFTPFileList遍历每个文件时从globalMap检索值:

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

一旦tFileList/tFTPFileList遍历了目录中的每个文件,它就会通过OnSubjobOk链接触发下一个子作业,我们从使用tBufferInput组件读回完成的缓冲区开始。在这一点上,我已经开始在整个流程中分散tLogRow组件,以便在每个步骤中更好地可视化数据

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

在这里,我使用下面的regex
“^.+?\uOutbound\\.xml$”
来捕获日期时间戳。它依赖于文件名是任意字符的组合,后跟字符串文字
\u Outbound\u
,然后后跟我们要捕获的日期时间戳(由12个数字字符表示),然后以
.xml
结束

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

由于额外的列是格式为
yyyyMMddhhmm
的日期时间戳,我们可以在这里直接指定它,并从那时起将其用作日期对象

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

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


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