Talend - 一行到多行,可变数量的输出行

时间:2011-10-27 18:30:18

标签: java talend

背景:在Talend中使用类似tSplitRow的内容将一行包含多个字段映射到多行。带字段的行:

Date | Name | MorningPhone | Day Phone | EveningPhone ......可以分成:

Date | Name | Phone ...并且您将始终从一行中得到3行。


问题:如果我想要来自可变数量字段的行数,该怎么办?

我有一个架构:UniqueID | FieldSet其中FieldSet是一个可以被九整除的列的分隔字段。如果有45个字段,在此分隔列中,我想要5行。 81个字段=> 9行。

我正在尝试使用tJavaRow来解析字段,但我不知道如何将其与tSplitRow组合以生成适当数量的字段。

想法?谢谢!

2 个答案:

答案 0 :(得分:2)

我使用了自定义tJavaRow - 这将特殊格式的字符串转换为新表。一个黑客,但它的工作。

String input = "";
String OUT = "";


try {
      input = java.net.URLDecoder.decode(input_row.CustomField16, "ASCII");

} catch (UnsupportedEncodingException e) {
      e.printStackTrace();
}

String[] pieces = input.split(";");

/*for(int a=0; a<pieces.length; a++)
      System.out.println("Piece "+a+"\n"+pieces[a]);*/



String[] allfields = pieces[0].split("\\|");

//System.out.println("num_full_rows="+num_full_rows);


int fieldnum=9;
int totalrows=1;
for (int i=0; i+8<allfields.length; i++) {

      String xrow = allfields[i];
      i++;
      for (int j=i; j<fieldnum*totalrows;j++){
            xrow=xrow+"\t"+allfields[j];
      }
      i+=fieldnum-2;

      totalrows++;
      OUT += (input_row.LoadTime + "\t"
                  + input_row.minutepart + "\t" + input_row.TXID
                  + "\t" + input_row.SessionString + "\t" + xrow + "\n");


}

output_row.BULK = OUT;

答案 1 :(得分:1)

自从提出这个问题以来,Talend已经发展了,更好的方法就是使用tNormalize组件。

enter image description here

首先,我们使用这样的文件作为输入:

pepe|123|123
juan|454|2423|34343|5454

我们使用tFileInputRegex组件读取此文件。我们必须定义正则表达式和模式。正则表达式为:

"^([^|]+)\\|(.+)"

架构将是:

enter image description here

然后,我们将tFileInputRegex与tNormalize连接起来。我们将分隔符设置为:

"\\|"

最后我们根据需要使用输出。