2011-10-27 32 views
0

背景: TalendではtSplitRowのようなものを使用して、多くのフィールドを持つ1つの行を複数の行にマッピングするのが一般的です。フィールドを持つ行:Talend - 1行から多くの可変数の出力行

Date | Name | MorningPhone | Day Phone | EveningPhone ...に分割することができます

Date | Name | Phone ...そして、あなたは常に1行から3行結果があるでしょう。


質問:私はフィールドの可変数の行数をしたい場合はどう

私はスキーマを持っています:UniqueID | FieldSet FieldSetは、9で割り切れる列の区切られたフィールドです。この区切られた列に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を接続してください。セパレータを次のように設定します。

"\\|" 

最後に、必要に応じて出力を使用します。

関連する問題