Java 如何根据修改的时间从tftpfilelist中提取最近2天的文件,而不存储在TBUFFER输出组件talend作业中

Java 如何根据修改的时间从tftpfilelist中提取最近2天的文件,而不存储在TBUFFER输出组件talend作业中,java,talend,jobs,Java,Talend,Jobs,到目前为止,我正在遍历文件夹中所有可用的5k文件,并将它们存储在TBUFFER输出中,然后使用TBUFFER输入读取它们,并根据mtime desc(ftp站点中的修改时间)按降序对它们进行排序,并仅提取前10个文件 由于它一次遍历所有5k文件,因此会消耗大量时间,并导致远程ftp站点出现不必要的延迟问题 我想知道是否有其他不需要迭代的简单方法,直接从ftp站点获取最新的前10个文件,并根据mtime desc对它们进行排序,然后对它们执行操作 我的talend工作流程目前看起来是这样的,我会建

到目前为止,我正在遍历文件夹中所有可用的5k文件,并将它们存储在TBUFFER输出中,然后使用TBUFFER输入读取它们,并根据mtime desc(ftp站点中的修改时间)按降序对它们进行排序,并仅提取前10个文件

由于它一次遍历所有5k文件,因此会消耗大量时间,并导致远程ftp站点出现不必要的延迟问题

我想知道是否有其他不需要迭代的简单方法,直接从ftp站点获取最新的前10个文件,并根据mtime desc对它们进行排序,然后对它们执行操作

我的talend工作流程目前看起来是这样的,我会建议任何其他可以更好地优化工作性能的方法!

基本上,我不想迭代和运行ftp站点中的所有文件,而是直接从远程ftp:tftpfilelist获取前10名,并在db中执行检查,稍后下载它们

在没有迭代的情况下,是否可以仅通过使用修改后的时间戳来获取最新的10个文件 或 我想从远程ftp站点提取最近3天的文件

文件名的格式如下:A_B_C_D_E_20200926053617.csv

方法B:使用JAVA, 我尝试如下使用tjava代码:对于流B:

Date lastModifiedDate = TalendDate.parseDate("EEE MMM dd HH:mm:ss zzz yyyy", row2.mtime_string);

Date current_date = TalendDate.getCurrentDate();

System.out.println(lastModifiedDate);

System.out.println(current_date);
System.out.println(((String)globalMap.get("tFTPFileList_1_CURRENT_FILE")));

if(TalendDate.diffDate(current_date, lastModifiedDate,"dd") <= 1) {

System.out.println

output_row.abs_path = input_row.abs_path;

System.out.println(output_row.abs_path);
}
Date lastModifiedDate=TalendDate.parseDate(“EEE-MMM-dd-HH:mm:ss-zzz-yyyy”,row2.mtime\u字符串);
当前日期=TalendDate.getCurrentDate();
System.out.println(lastModifiedDate);
系统输出打印项次(当前日期);
System.out.println(((字符串)globalMap.get(“tFTPFileList\u 1\u CURRENT\u FILE”));

如果(TalendDate.diffDate)(当前_日期,lastModifiedDate,“dd”)定义3个上下文变量:

在tJava中,计算3天(从当前日期开始)的掩码(使用通配符):

然后在tFTPFileList中,为filemask使用3个上下文变量:


仅从今天和前两天检索文件。

定义3个上下文变量:

在tJava中,计算3天(从当前日期开始)的掩码(使用通配符):

然后在tFTPFileList中,为filemask使用3个上下文变量:


仅检索今天和前两天的文件。

由于文件名中有日期,您可以为这3天创建3个文件掩码,并在tFTPFileList中使用它们仅检索这些文件。不,这不起作用,因为在特定的一天,我们可能会收到n个文件和时间戳(hhmmss)可能会有所不同,因为我们一天收到这么多文件,这必须是自动化的,所以我不能一直对每个作业的值进行硬编码运行无需硬编码任何内容,您可以使用通配符计算日期的掩码(今天或昨天)以及之前的两个日期,例如,
*20200926*.csv*20200925*.csv*20200924*.csv
,将它们放在上下文或全局映射中,并在tFTPFileList中使用它们。是的,我明白了,但我如何继续动态地更改日期范围,比如说下周的日期将完全不同,而且每天都会定期运行此作业ce或一天两次。在这种情况下,我无法真正计算文件掩码并将其附加到上下文或全局。请为您查看我的答案:-)由于文件名中有日期,也许您可以为这3天创建3个文件掩码,并在tFTPFileList中使用它们仅检索这些文件。否,这是行不通的,因为在特定的一天,我们可能会收到n个文件,而且时间戳(hhmmss)可能会有所不同,因为我们一天收到这么多文件,这必须是自动化的,所以我不能一直对每个作业的值进行硬编码运行无需硬编码任何内容,您可以使用通配符计算日期的掩码(今天或昨天)以及之前的两个日期,例如,
*20200926*.csv*20200925*.csv*20200924*.csv
,将它们放在上下文或全局映射中,并在tFTPFileList中使用它们。是的,我明白了,但我如何动态地继续更改日期范围,假设下周的日期会完全不同,而且每天都会定期运行此作业,每天一次或两次。在这种情况下,我无法真正计算文件掩码并将其附加到上下文或globalMapSee。请参见我的答案:-)非常感谢您提供的解决方案,它真的很有帮助,我也在寻找一种方法,如果我想调整一些文件,比如说5天以上,如果有一种方法,我可以只更改一个参数并使其工作。无论如何,感谢您的输入,我将尝试在这方面进一步:)@Tommy您可以将此答案标记为已接受,然后在需要时打开另一个问题,谢谢。非常感谢这个解决方案,它真的很有帮助,我也在寻找一种方法,如果我想调整一些文件,比如说5天以上,如果有一种方法,我可以只更改一个参数并使其工作。无论如何,感谢您的输入,我会在这方面做更多的尝试:)@Tommy你可以将这个答案标记为已接受,然后在需要时再问一个问题,谢谢。
Date currentDate = TalendDate.getCurrentDate();
Date currentDateMinus1 = TalendDate.addDate(currentDate, -1, "dd");
Date currentDateMinus2 = TalendDate.addDate(currentDate, -2, "dd");

context.mask1 ="*" + TalendDate.formatDate("yyyyMMdd", currentDate) + "*.csv";
context.mask2 ="*" + TalendDate.formatDate("yyyyMMdd", currentDateMinus1) + "*.csv";
context.mask3 ="*" + TalendDate.formatDate("yyyyMMdd", currentDateMinus2) + "*.csv";