2011-10-27 68 views
0

背景:在Talend中使用类似tSplitRow的东西将包含多个字段的行分成多行是很常见的。与字段的行:Talend - 一行到多行,可变数量的输出行

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

Date | Name | Phone ...你将永远有从一行3个结果行。


问:如果我想从字段的变量数列的数是什么?

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

我想使用tJavaRow解析字段,但我不知道如何将它与tSplitRow结合来生成适当数量的字段。

想法?谢谢!

回答

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; 
+0

想不到更好的方法来做到这一点。 – drmirror

+0

此方法已弃用。请参阅下面的答案 –

1

Talend自这个问题出现以来就有了进步,而做这件事的更好方法是使用tNormalize组件。

enter image description here

首先,我们使用一个文件中像这样输入:

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

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

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

的模式将是:

enter image description here

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

"\\|" 

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