BookmarkSubscribeRSS Feed

[SAS 프로그래밍 고수 백승민] [INFILE/GOTO] 엔터(Enter) 삽입된 데이터 읽기

Started ‎06-11-2020 by
Modified ‎06-11-2020 by
Views 122

* 질문 : http://cafe.daum.net/statsas/B3m/13507

 

1. 최홍규님 답변(http://cafe.daum.net/statsas/B3m/13512)

 /*

   자동변수 _infile_  에서 사전에 구분자 갯수를 체크해서 중간에 줄바꿈이 일어났는가를 확인하고..

    input line을 이어 붙이는 방법을 쓰면 어떨까 모르겠네요...

*/

 data text;
infile cards dsd dlm='|';
 

 length one_row $ 32767;

 chk_rtn:
          input @;
          one_row = trim(one_row) || _infile_;
          if countc(one_row,'|') < 3 then do;
             input ;
             goto chk_rtn;
          end;

_infile_ = one_row;

 input a b $ c d;

 drop one_row;

cards;
123|dfg|479|
245|ab
c|555|
345|vwx|111|387
;
run;

 

2. 백승민 재현(http://cafe.daum.net/statsas/B3m/13515)

* GOTO 구문의 활용도를 제대로 확인할 수 있는 문장이네요;

* 이런 아이디어를 생각하시니 진정한 고수의 능력 이십니다..^^;

 

* 최홍규님께서 구현하신 문장을 Retain으로 재현 보았습니다.;

 data back;
     infile cards dsd dlm='|';
     length var var1 $100.;
     retain var1 ;
     input @;
     var = _infile_;
     if countc(var,'|') >= 3 then do;   
        i=1;
     var1=var;
     end;
     else do;
        i+1;
     if mod(i,2)=0 then do;
           var1 = var;
     delete;
     end;
     else do;
           var1 = compress(var1||var);
        end;
     end;
     _infile_ = var1;
     input a b $ c d;
  keep a--d ;
cards;
123|dfg|479|
245|ab
c|555|
568|cd
|789|698
345|vwx|111|387
568|cd
|789|698
;
run;

 

3. 조재천님 엔터 들어간 라인 확인(http://cafe.daum.net/statsas/B3m/13513)

 /*테스트용 : a.txt


123|abc def|479|
245|ab
c|555|
345|vwx|111|387
*/

 

 

data WORK.a                                       ;
    %let _EFIERR_ = 0; /* set the ERROR detection macro variable */
    infile 'C:\Documents and Settings\user\바탕 화면\a.txt' recfm= n   delimiter = '|'   lrecl=32767  ;
    input
                a $
                b $
                c $
    ;
    if _ERROR_ then call symputx('_EFIERR_',1);  /* set ERROR detection macro variable */
 run;

/*일단 모두 문자로 불러들였습니다. 숫자가 필요한 경우 사전 또는 사후에 변환하시면 될 것 같습니다*/

/* recfm= n에 대해서 잘 모르지만 해당 구문에 해보니 일단 자기 위치는 찾아 주는것 같습니다*/

/* 이렇게 불러들여도 데이타셋을 보면 엔터 표시가 있어 삭제가 필요한데 엔터를 인식하는 방법을

    모르겠네요. 최초 아래한글에서라도 엔터 표시가 있음 일괄 엔터표시 삭제하여 연결되도록 하는 하려했는데

    한글에 대해서 자세히는 모르겠네요*/


data aa; set a;
 array tt {3} a--c;
 do i =1 to 3;
  tt{i} = compress(tt{i}, ,'s') ;
 end;
 drop i;
 run;

/*이와 같이 하면 데이타셋에 있는 엔터표시는 삭제했지만 원래 공백이 있는 컬럼까지

   공백을 제거하는 문제점이 있습니다*/

 

data  ck; set a;
n=_n_;
 if compress(a||b||c, ,'n')^='' then output ck;
run;
/*엔터가 있는 레코드만 별도로 찾아 보기 위한 구문입니다

   문제가 있는 부분을 찾아 원본 수정 또는 불러들인 데이타를 수정해보심은...*/

Version history
Last update:
‎06-11-2020 09:14 PM
Updated by:
Contributors

sas-innovate-wordmark-2025-midnight.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.


Register now!

Article Labels
Article Tags