2016-10-26 3 views
-2

어떻게 UTL_FILE을 사용하여 다중 라인 파일을 구문 분석합니까? 아래의 예에서 snippet - '1'로 시작하는 줄은 파일 헤더 - 파일 당 하나입니다. '5'로 시작하는 줄은 트랜잭션 헤더입니다. 트랜잭션 당 하나입니다. '8'로 시작하는 줄은 트랜잭션 트레일러입니다. '9'로 시작하는 줄은 파일 당 하나입니다.Oracle에서 다중 라인 플랫 파일 구문 분석

나는 1) 파일 행을 읽고 2) 트랜잭션이 시작하고 끝나는 곳을 구별 할 수있는 논리가 필요하다. 한 줄에, 나는 오라클이 그것의 다른 값을 구별하기위한 instr과 substr을 가지고 있다는 것을 알고있다.

모든 의견을 환영합니다! 시간 내 줘서 고마워.

1TreasuryPart 201610031830MEMO                                                                   
53336  Bank1Base0000001                                                                    
650 3100000126   1-30-00010-00  000002126100000000000000021261USD20161003RAYMOND SOLIS   [email protected]     205-888-9900       20161003020030000001     WEBENRAPC34560000000000     WEB      
800000000010000000212610000000000000000001                                                                 
53336  Bank1Base0000002                                                                    
800000000000000000000000000000000000000002                                                                 
53343  ToddMUD  0000001                                                                    
800000000000000000000000000000000000000001                                                                 
53343  ToddMUD  0000002                                                                    
800000000000000000000000000000000000000002                                                                 
53351  DenisTM  0000001                                                                    
650 3100000128   7779026   000004000000000000000000080000USD20161003Denis Pellerin  [email protected]            405-922-2116  20161003100421000001     WEBUNEAPC34560000000000     WEB      
650 3100000128   7779026   000004000000000000000000080000USD20161003Denis Pellerin  [email protected]            405-922-2116  20161003100421000002     WEBUNEAPC34560000000000     WEB      
800000000020000000800000000000000000000001                                                                 
53351  DenisTM  0000002                                                                    
800000000000000000000000000000000000000002                                                                 
9000006000000000003000000101261000000000000                                                                 
+0

무엇을 시도 했습니까? 어떤 문제가 있습니까? 'SQL * Loader'가 아닌'utl_file'을 사용하기를 원한다고 말하면'get_line'을 호출하여 파일에서 행을 읽는 방법을 알고 있다고 가정합니다. 'substr'과'instr'을 사용하여 그 라인의 첫번째 문자를 얻을 수 있다는 것을 알고 있습니다. 이미 1과 5를 읽었는지 여부를 알려주는 일종의 지역 변수가 필요하므로 트랜잭션 행을 읽고 (그리고 행을 파싱하는 방법을 알고 있어야합니다.) –

+0

나는 5 개의 임의의 수에 대해 1, 1의 레코드에 대해 1 레코드를 정의하고, 6의 수에 대해 1 레코드, 8의 수에 대해 1 레코드, 9에 대해 1 레코드를 정의했습니다. utl_file.fgetattr을 수행했습니다 파일이 존재하는지 확인하십시오. 레코드마다 레코드 변수를 파싱 할 수도 있습니다. 제가 언급했듯이, 첫 번째 줄부터 다음 줄로 읽는 방법, 그리고 트랜잭션 A가 끝나고 트랜잭션 B가 시작되는 지점을 파악할 때 붙어 있습니다. 위의 예에서 5와 8 사이에 두 개의 연속 된 6을 사용하는 것이 유효한 경우입니다. – QuickDrawMcgraw

+0

"첫 번째 줄에서 다음 줄까지 읽음"이 무엇을 의미하는지 모르겠습니다. 필자는 파일에서 다음 줄을 얻기 위해 단순히'utl_file.get_line'을 호출하는 것으로 해석 할 것입니다. 그것은 실제로 당신이 요구하고있는 것 같지는 않습니다. 나는 트랜잭션을 읽기 위해서 당신이 8을 가질 때까지 당신이 5를 만났을 때 루프에서'utl_file.get_line'을 호출 할 것이라고 가정하지만, 그것은 파일의 구조를 추측합니다. –

답변

0

나는 당신이 무엇을 찾고 있는지 잘 모르겠습니다. 글을 올리는 것은 우리가 추측하지 못하도록 항상 도움이됩니다. 나는 각각의 개별 유형을 파싱하도록 정의 된 별도의 절차가있는 곳에서 이와 같은 것을 원한다고 생각한다.

declare 
    l_file utl_file.file_type; 
    l_line varchar2(4000); 
    l_in_transaction boolean := false; 
begin 
    l_file := utl_file.fopen(<<parameters>>); 

    loop 
    utl_file.get_line(l_file, l_line); 
    if(substr(l_line,1,1) = '1' and l_in_transaction = false) 
    then 
     parse_file_header(l_line); 
    end if; 
    if(substr(l_line,1,1) = '5' and l_in_transaction = false) 
    then 
     parse_transaction_header(l_line); 
     l_in_transaction := true; 
    end if; 
    if(l_in_transaction = true) 
    then 
     parse_transaction_row(l_line); 
    end if; 
    if(substr(l_line,1,1) = '8' and l_in_transaction = true) 
    then 
     parse_transaction_trailer(l_line); 
     l_in_transaction := false; 
    end if; 
    if(substr(l_line,1,1) = '9' and l_in_transaction = false) 
    then 
     parse_file_trailer(l_line); 
    end if; 

    end loop; 
exception 
    when no_data_found 
    then 
    utl_file.fclose(l_file); 
end; 
+0

감사합니다 저스틴. 그러나 논리가 어떻게 '6'이 둘 이상인 '5'를위한 계정입니까? – QuickDrawMcgraw

+0

@QuickDrawMcgraw - 글쎄, 5가 있으면'l_in_transaction'이 true로 설정됩니다. 루프가 반복 될 때마다 다음 줄을 읽고 그것을 8로 나올 때까지'parse_transaction_row'에 넘깁니다. 모든 트랜잭션 세부 사항 행이 6으로 시작하면 (요구 사항에 해당하지 않는 경우)'l_in_transaction'이 필요하지 않습니다. 첫 번째 문자가 6 일 때마다'parse_transaction_row'를 호출 할 수 있습니다. –

+0

죄송합니다. 원래 질문에서 '5'마다 '6'레코드를 놓친 것 같습니다. 당신의 가이드를 따라 가며 그것이 어떻게 진행되는지보십시오. 고마워 저스틴, 정말 고마워. 그러나 예, 하나 이상의 '6이 존재하기 위해서는 5가 있어야합니다. – QuickDrawMcgraw

관련 문제