背景:我正在使用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检查那些时期。有什么建议吗?
答案 0 :(得分:13)
扩展Balazs Gunics给出的答案
你的第一部分是计算一行的行数,在日期和日期之间使用日期差异函数很容易
第2部分是将该值传递给tFlowToIterate,并使用tJavaFlex将其拾取,该tJavaFlex将在其起始代码中使用它来控制for循环:
tJavaFlex start:
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
答案 1 :(得分:0)
您可以使用tJavaFlex执行此操作。
如果您有少量列,则tFlowToIterate - &gt; tJavaFlex选项可能没问题。
在开始部分,您可以开始迭代,在主要部分中,您可以为输出模式指定值。如果您将输出命名为row6,则:
row6.id = (String)globalMap.get("id");
等等。
答案 2 :(得分:0)
我来到这里是因为我想将所有 context
参数添加到 Excel 数据表中。因此,当您采用 0 个输入行时,下面的解决方案有效,但可以调整为为输入中的每一行生成多行。
设计实际上很简单:
tJava –trigger-on-OK→ tFileInputDelimited → tDoSomethingOnRowSet
↓ ↑
[write into a CSV] [read the CSV]
这里是 tJava 中可用的代码结构类型。
try {
StringBuffer wad = new StringBuffer();
wad.append("Key;Nub"); // Header
context.stringPropertyNames().forEach(
key -> wad.
append(System.getProperty("line.separator")).
append(key + ";" + context.getProperty(key) )
);
// Here context.metadata contains the path to the CSV file
FileWriter output = new FileWriter(context.metadata);
output.write(wad.toString());
output.close();
} catch (IOException mess) {
System.out.println("An error occurred.");
mess.printStackTrace();
}
当然,如果您有一组行作为输入,您可以调整该过程以使用 tJavaRow 而不是 tJava。
您可能更喜欢使用 Excel 文件作为磁盘缓冲区,但是如果您没有在 Talend 中配置 Java 库,那么至少在第一次处理这种文件格式时需要做更多的工作。如果您仍然选择这样做,Apache POI 可能会对您有所帮助。