2011-10-27 2 views
0

Background : Talend에서는 tSplitRow와 같은 것을 사용하여 많은 필드가있는 행 하나를 여러 행으로 매핑하는 것이 일반적입니다. 필드 행은 : Talend - 한 행에서 여러 행까지의 출력 행

Date | Name | MorningPhone | Day Phone | EveningPhone

...로 분할 할 수있다 :

Date | Name | Phone ... 그리고 당신은 항상 하나의 행에서 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를 연결합니다. 구분자는 다음과 같이 설정합니다.

"\\|" 

마지막으로 필요한 출력을 사용합니다.