* 출처 : http://cafe.daum.net/statsas/3F8j/168
* SAS에서 외부 데이터를 가져올 경우 라이센스가 없는 경우에는 해당 DB에서 엑셀이나 텍스트(TXT)등으로
데이터를 변환 후에 가져오는 상황이 발생. 이 경우에도 배치 파일등을 만들어서 해결가능하지만,
엑셀과 SAS를 통한 자동화 방법을 구현해 보았습니다. 데이터 용량이 많은 경우에는 제한이 되겠지만,
적은 데이터를 가져오는 경우에 사용이 가능할 듯 합니다. ( 데이터가 커지면 ACCESS 활용 가능 할듯);
* SAS와 현재 엑셀에서 지원되는 과거 엑셀4.0 매크로함수(아마도 엑셀의 VBA이전 버젼)를 이용하여
엑셀 프로그램을 실행하여 데이터 가져오기(ODBC)를 실행하여 실행 값으 다시 SAS에서 가져오는 방법.
엑셀에서 데이터 가져오기를 자동화하기 위하여 엑셀 매크로 실행
SAS에서 엑셀의 매크로를 실행하여 데이터 가져오기를 새로고침한 후에, SAS에서 다시 엑셀의
데이터를 SAS로 읽어오는 방식.
* 엑셀에 대한 지식은 좀 더 찾아보시기를 바랍니다.
( 엑셀 보안(특히, 2007이후), 외부 데이터 가져오기 )
* 엑셀 보안 등의 옵션을 해제 필요;
/*****************************************************************
*** 기존 엑셀 닫음
*****************************************************************/
filename sas2xl dde 'excel|system';
* DDE 사용을 위하여 기존 활성화된 엑셀 닫음;
data _NULL_;
file sas2xl;
put '[error(false)]';
put '[file.close(false)]'; * 저장하지 않고 닫음;
put '[QUIT()]';
RUN;
* 엑셀 매크로 저장된 엑셀 파일;
%let xlsTemplatePath = C:\Documents and Settings\MASTER\바탕 화면\LOADING\WEBLOG.xls;
* 엑셀프로그램 실행시;
*%let xlsCmdPath = C:\Program Files\Microsoft Office\Office12\excel.exe;
*x "'&xlsCmdPath.'";
%let excelout = C:\Documents and Settings\MASTER\바탕 화면\LOADING\WEB_RESULT.xls;
* DOS창 비활성화;
options noxwait noxsync;
* 엑셀파일 실행;
x "'&xlsTemplatePath.'";
/*****************************************************************
*** 엑셀 실행을 위하여 2초간 대기
*****************************************************************/
data _null_;
rc = sleep(2);
run;
filename sas2xl dde 'excel|system';
data _NULL_;
file sas2xl;
* 엑셀프로그램(xlsCmdPath) 실행 후 파일 오픈;
*put "[open(""&xlsTemplatePath."", 0 , true)]";
* 엑셀 매트로 실행(Macro1에 데이터 추출 프로그램 삽입);
put "[run(""Macro1"")]";
run;
FILENAME XLSIN DDE 'excel|Sheet1!r2c1:r9c10';
data WEB_DAT;
INFILE XLSIN;
INPUT (A1-A2) ($);
run;
DATA TEST1;
file sas2xl;
put '[error(false)]';
* 새로운 파일로 저장(WEBLOG.xls 읽기 전용 으로 열려서 저장안됨);
PUT "[save.as(""&excelout."")]";
put '[close.ALL()]';
put '[QUIT()]';
RUN;
/*****************************************************************
*** 엑셀 외부데이터 가져오기
*****************************************************************/
* 상세내용은 인터넷이나 첨부문서(외부데이터가져오기(EXCEL).pdf) 참고;
* 건수가 많은 경우에는 ACCESS 사용 고려;
* 엑셀 매크로 : 데이터 새로고침 실행;
* Sub Macro1()
* Selection.QueryTable.Refresh BackgroundQuery:=False
* End Sub
* 외부데이터 가져오기(MYSQL);
* select SUBSTRING(DATE_FORMAT(CURDATE,'%Y%m%d'),1,6) ,
* sum(visitorcnt)
* from `user_time_1`
* where SUBSTRING(DATE_FORMAT(CURDATE,'%Y%m%d'),1,6) BETWEEN SUBSTRING(DATE_FORMAT(DATE_ADD(NOW(),INTERVAL-3 MONTH),'%Y%m%d'),1,6)
* AND SUBSTRING(DATE_FORMAT(DATE_ADD(NOW(),INTERVAL-1 MONTH),'%Y%m%d'),1,6)
* group by SUBSTRING(DATE_FORMAT(CURDATE,'%Y%m%d'),1,6)
* 상세내용 첨부파일 참조
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9.
Early bird rate extended! Save $200 when you sign up by March 31.