Java FTP使用Talend,是否仅获取最新文件?
我有一个Talend工作,我需要从sFTP服务器中提取一个XML文件,然后将其处理到Oracle数据库中。XML提取的日期在文件名中,例如“FileNameHere\u Outbound\u 201407092215.XML”,我认为这是yyyyMMddhhmm格式。所有文件的开头部分“FileNameHere”都相同。我需要能够读取文件名末尾的日期,并且只从要处理的服务器上下拉该日期 我不知道如何使用FTP实现这一点。我以前使用过tFilelist按日期降序对项目进行排序,但这不是FTP的选项。我知道在如何提取文件名的部分时可能涉及到一些Java,但我不是很懂Java。不过,只要有一点帮助,我就能应付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的选项
有人知道如何只从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文件路径:
您可以按修改日期订购,有时就足够了