Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Talend-从1行生成n个多行_Java_Row_Etl_Talend - Fatal编程技术网

Java Talend-从1行生成n个多行

Java Talend-从1行生成n个多行,java,row,etl,talend,Java,Row,Etl,Talend,背景:我正在使用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 | Mar

背景:我正在使用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检查这些句点。有什么建议吗?

您可以使用tJavaFlex来实现这一点

若您有少量的列,则可以使用tFlowToIterate->tJavaFlex选项

在开始部分,您可以开始迭代,在主要部分,您可以为输出模式分配值。如果将输出命名为第6行,则:

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

等等。

扩展Balazs Gunics给出的答案

第一部分是计算一行将变成的行数,在“到”和“从”日期上使用date diff函数非常简单


第2部分是将该值传递给tflowtointerate,并使用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++) { 
结束

和样本输出:

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

我来到这里是因为我想将所有
上下文
参数添加到Excel数据表中。因此,下面的解决方案在获取0个输入行时有效,但可以调整为为输入中的每一行生成几行

设计实际上是直截了当的:

tJava –trigger-on-OK→ tFileInputDelimited  → tDoSomethingOnRowSet
  ↓                          ↑
[write into a CSV]     [read the CSV]
下面是tJava中可用的代码结构

试试看{
StringBuffer wad=新的StringBuffer();
append(“Key;Nub”);//头
context.stringPropertyNames().forEach(
按键->wad。
追加(System.getProperty(“line.separator”))。
追加(键+“;”+context.getProperty(键))
);
//此处context.metadata包含CSV文件的路径
FileWriter输出=新的FileWriter(context.metadata);
output.write(wad.toString());
output.close();
}捕获(IOM异常){
System.out.println(“发生错误”);
printStackTrace();
}
当然,如果您有一组行作为输入,您可以调整流程以使用tJavaRow而不是tJava


您可能更喜欢使用Excel文件作为磁盘上的缓冲区,但处理这种文件格式至少在第一次没有在Talend中配置Java库时需要做更多的工作。如果您选择这样做,可能会对您有所帮助。

我假设这些是dd-MM-yyy格式的日期?这实际上并不是一件常见的事情,我正在努力想一个(好的)理由以这种方式规范化示例数据,但我对如何做到这一点有一些想法。日期格式是意大利语格式,这不是一个问题。我需要这样做,因为原始记录看起来像一个聚合的记录,尽管我的目标数据库。但是我对你的想法很好奇:)你是对的,它可能需要tJavaFlex来做这件事,但是你应该给这个答案添加更多的细节,因为它目前无法解决OP的问题。是的,这是我确切的思考过程。做得很好,我喜欢用截图来进一步解释部分答案。
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
tJava –trigger-on-OK→ tFileInputDelimited  → tDoSomethingOnRowSet
  ↓                          ↑
[write into a CSV]     [read the CSV]