* 질문 : 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;
/*엔터가 있는 레코드만 별도로 찾아 보기 위한 구문입니다
문제가 있는 부분을 찾아 원본 수정 또는 불러들인 데이타를 수정해보심은...*/
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.