Talend – 从1行生成n个多行

背景:我正在使用Talend做某事(我猜)这很常见:从一个生成多行。 例如:

ID | Name | DateFrom | DateTo

01 | Marco| 01/01/2014 | 04/01/2014

……可以分成:

new_ID | ID | Name | DateFrom | DateTo

01 | 01 | Marco | 01/01/2014 | 02/01/2014

02 | 01 | Marco | 02/01/2014 | 03/01/2014

03 | 01 | Marco | 03/01/2014 | 04/01/2014

输出行的数量是动态的,具体取决于原始行中的日期。

问题:我该怎么做? 也许使用tSplitRow? 我将用tJavaRow检查那些时期。 有什么建议么?

扩展Balazs Gunics给出的答案

您的第一部分是计算一行的行数,在日期和日期之间使用日期差异函数很容易

总体看法

计算每行的行数


第2部分是将该值传递给tFlowToIterate,并使用tJavaFlex将其拾取,该tJavaFlex将在其起始代码中使用它来控制for循环:

tJavaFlex开始:

 int currentId = (Integer)globalMap.get("out1.id"); String currentName = (String)globalMap.get("out1.name"); Long iterations = (Long)globalMap.get("out1.iterations"); Date dateFrom = (java.util.Date)globalMap.get("out1.dateFrom"); for(int i=0; i<((Long)globalMap.get("out1.iterations")); i++) { 

主要

  row2.id = currentId; row2.name = currentName; row2.dateFrom = TalendDate.addDate(dateFrom, i, "dd"); row2.dateTo = TalendDate.addDate(dateFrom, i+1, "dd"); 

结束

 } 

和样本输出:

 1|Marco|01-01-2014|02-01-2014 1|Marco|02-01-2014|03-01-2014 1|Marco|03-01-2014|04-01-2014 2|Polo|01-01-2014|02-01-2014 2|Polo|02-01-2014|03-01-2014 2|Polo|03-01-2014|04-01-2014 2|Polo|04-01-2014|05-01-2014 2|Polo|05-01-2014|06-01-2014 2|Polo|06-01-2014|07-01-2014 2|Polo|07-01-2014|08-01-2014 2|Polo|08-01-2014|09-01-2014 2|Polo|09-01-2014|10-01-2014 2|Polo|10-01-2014|11-01-2014 2|Polo|11-01-2014|12-01-2014 2|Polo|12-01-2014|13-01-2014 2|Polo|13-01-2014|14-01-2014 2|Polo|14-01-2014|15-01-2014 2|Polo|15-01-2014|16-01-2014 2|Polo|16-01-2014|17-01-2014 2|Polo|17-01-2014|18-01-2014 2|Polo|18-01-2014|19-01-2014 2|Polo|19-01-2014|20-01-2014 2|Polo|20-01-2014|21-01-2014 2|Polo|21-01-2014|22-01-2014 2|Polo|22-01-2014|23-01-2014 2|Polo|23-01-2014|24-01-2014 2|Polo|24-01-2014|25-01-2014 2|Polo|25-01-2014|26-01-2014 2|Polo|26-01-2014|27-01-2014 2|Polo|27-01-2014|28-01-2014 2|Polo|28-01-2014|29-01-2014 2|Polo|29-01-2014|30-01-2014 2|Polo|30-01-2014|31-01-2014 2|Polo|31-01-2014|01-02-2014 

您可以使用tJavaFlex来执行此操作。

如果您有少量列,则tFlowToIterate – > tJavaFlex选项可能没问题。

在开始部分,您可以开始迭代,在主要部分中,您可以为输出模式指定值。 如果您将输出命名为row6,则:

 row6.id = (String)globalMap.get("id"); 

等等。

Interesting Posts