2010년 4월 6일 화요일

[PROC FREQ] OneWayFreqs output data set 생성하기

기본으로 제공되는 결과 양식을 조금 수정하여 보기 좋게 변경하는 예제입니다.


ods listing close;
ods output OneWayFreqs=outfreq;                                                  
                                                                                  
proc freq data=sashelp.class;                                                    
   tables age sex;                                                                
run;                                                                              
                                                                                  
ods output close;                                                                
ods listing;                                                                      
                                                                                  
proc print data=outfreq label;                                                    
run;                                                                              
                                                                                  
/* 테이블 양식 정리 */    
data allfreq;                                                                    
   retain table column_value;                                                    
   set outfreq;                                                                  
   keep table column_value frequency percent cumfrequency cumpercent;  

   table=scan(table,1,' ');  

   column_value=trim(left(vvaluex(table)));                                      
   label table='Table'                                                            
         column_value='Column_Value';                                            
run;                                                                              
                                                                                  
proc print data=allfreq label;                                                    
run;

2010년 4월 4일 일요일

데이터 셋 찾기

데이터셋 이름을 파라메터로 입력하면 어떤 라이브러리에 있는지 찾아주는 매크로 입니다.
 
%macro findDataSet(dsname);

    proc sql noprint;
        select  libname into :lib separated by ','
        from    sashelp.vmember
        where   memname=upcase("& dsname") and memtype='DATA'
        ;
    quit;
    %put Data Set [& dsname]은 [&lib] Library에 있습니다;

%mend findDataSet;

%findDataSet(adomsg);

2010년 3월 30일 화요일

화면에서 매크로 변수 값 입력

거의 20년전에 베이직이나 포트란으로 코딩하던 향수를 불러 일으키네요. ^^

화면에서 매크로 변수값을 입력하는 간단한 예제 입니다.


%WINDOW INFO
  #5 @6 '작업년월을 입력하세요(jobbaseym)[yyyymm]:'
  #5 @50 JOBBASEYM 6 ATTR=UNDERLINE;

%DISPLAY INFO;

%LET JOBBASEYM=%TRIM(&JOBBASEYM);
%LET YEAR=%SUBSTR(&JOBBASEYM,1,4);

%PUT *********************;
%PUT [작업년월]:&JOBBASEYM;
%PUT [작업연도]:&YEAR;
%PUT *********************;


입력 화면에 컬러를 추가하는 예제입니다.

%window info color=gray  
  #3 @5 '환영합니다'
  #5 @5 'ID를 입력하세요:'                                                                                                          
  #5 @26 id 8 attr=underline                                                                                                            
  #7 @5 '오늘은 '                                                                                                                    
  #7 @15 "%sysfunc(today(),yymmdds10.)" attr=rev_video color=pink
  #7 @25 '일 입니다'
  #12 @29 'Press ENTER to continue.';
%display info;                                                                                                                          
                                                                                                                                        
%put [입력된 ID : &id];

2009년 11월 21일 토요일

EG설치오류 - SAS 서버가 요청한 작업을 수행할 수 없습니다.

PC EG 설치한 상태에서 Meta Server 연결후 파일부분을 열때는 전혀 문제 없고, 라이브러리 부분을 클릭하면 발생하는 Error 내용입니다.


Error
내용 : SAS 서버가 요청한 작업을 수행할 수 없습니다.

--------------------------------------------------------
'sas.iomprovider.1'
공급자는 로컬 컴퓨터에 등록할  없습니다.
------------------------------ Technical Information Follows ------------------------------

[SAS.EG.SDS.Model]
 'sas.iomprovider.1'
공급자는 로컬 컴퓨터에 등록할  없습니다.
 ----------------------------------------------------
   at SAS.EG.SDS.Model.Server.PopulateLibraries(Collection& collection)
   at SAS.EG.SDS.Model.Broker.PopulateCollection(Collection collection)
   at SAS.EG.SDS.Model.Collection.DoPopulate()
   at SAS.EG.SDS.Model.Collection.Populate()
   at SAS.EG.SDS.Views.View.DoPopulate(DisplayOperation& op)>>[System.Data]>>
>>
>> 'sas.iomprovider.1'
공급자는 로컬 컴퓨터에 등록할  없습니다.>>
>>
>> ---------------------------------------------------->>
>>
>>    at System.Data.OleDb.OleDbConnection.CreateProviderError(Int32 hr)
   at System.Data.OleDb.OleDbConnection.CreateProvider(OleDbConnectionString constr)
   at System.Data.OleDb.OleDbConnection.Open()
   at SAS.EG.SDS.Model.Server.PopulateLibraries(Collection& collection)>>>>
오류 정보가 없습니다. REGDB_E_CLASSNOTREG(0x80040154)>>>>
>>>>
>>>> ---------------------------------------------------->>>>
>>>>
>>>> 'sas.iomprovider.1'
공급자는 로컬 컴퓨터에 등록할  없습니다.

------------------------------ End of Technical Information ------------------------------

 

[조치]

oledb가 설치되지 않아 발생하는 문제로, client8cd\eguide\bundles\sasoledb setup.exe 실행하여 추가로 설치하면 해결 가능합니다.

2009년 10월 21일 수요일

불필요한 SAS work 라이브러리 삭제하기

SAS work 라이브러리는 쌔스 프로세스가 생성될 때 만들어져서 쌔스가 종료될 때 사라지는 임시 데이터 영역입니다. 그런데 프로세스가 비정상적인 상황에서 종료되어 미처 work라이브러리가 삭제되지 않는 경우가 있습니다.
오랜 시간 이 부분을 신경쓰지 않고 있다가 어느 날 문득 디스크 공간이 많이 줄어든 걸 알게 됩니다.

그럼 사용하지 않는 work디렉토리를 삭제해야겠지요.
sasv9.cfg 파일을 보면 다음과 같이 정의되어 있는 부분이 있습니다.

-work "directory명"


해당 디렉토리를 찾아보면, 다음과 같은 디렉토리들이 만들어져 있습니다.

SAS_workD81E0003B080_SAS3
SAS_work453A0001F0E2_SAS3
SAS_workE2EE0002C2FE_SAS3

바로 여기서 불필요한 디렉토리들을 삭제하면 됩니다.

그런데 현재 실행 중인 쌔스 프로세스가 있으면 어떤 것을 지워야 할 지 알기가 힘듭니다.
이런 경우 사용하기 위한 유틸리티가 있습니다.

바로 cleanwork라는 유틸리티 입니다.

사용법은 간단합니다.

cleanwork workdirectory명

이 명령을 사용하면 사용중인 work를 제외하고 나머지를 삭제할 수 있습니다.

가능한 한 사용자가 직접 지우는 것 보다 유틸리티를 사용하는 것이 안전상 좋습니다.

2009년 10월 17일 토요일

한글 label 테스트

갑자기 label을 한글로 쓰고 싶어졌습니다. 그래서 테스트를 해봤습니다.

windows XP, AIX 5에서 각각 다음 소스를 실행했습니다.
쌔스는 9.1.3 한글버전입니다.

개인적으로 쌔스 8버전에서 한글데이터 처리 때문에 고생했던 기억이 있어서 쌔스는 다국어에 약하다는 막연한 느낌이 있었습니다.

설마했는데 결과는 "잘 작동한다" 입니다.


[테스트 소스]

%macro Test_Korean_Label(label);

    %goto &label;

    %단계1:
        %put 단계1 실행;

    %단계2:
        %put 단계2 실행;

    %단계3:
        %put 단계3 실행;

    %종료:
        %put 종료처리;

%mend;


%Test_Korean_Label(단계2);

2009년 10월 16일 금요일

%SYSFUNC로 실행 가능한 함수



FunctionDescription and Syntax
ATTRCreturns the value of a character attribute for a SAS data set.
%SYSFUNC(ATTRC(data-set-id,attr-name))
ATTRNreturns the value of a numeric attribute for specified SAS data set.
%SYSFUNC(ATTRN(data-set_id,attr-name))
CEXISTverifies the existence of a SAS catalog or SAS catalog entry.
%SYSFUNC(CEXIST(entry <, 'U'>))
CLOSEcloses a SAS data set.
%SYSFUNC(CLOSE(data-set-id))
CUROBSreturns the number of the current observation.
%SYSFUNC(CUROBS(data-set-id))
DCLOSEcloses a directory.
%SYSFUNC(DCLOSE(directory-id))
DINFOreturns specified information items for a directory.
%SYSFUNC(DINFO(directory-id,info-items))
DNUMreturns the number of members in a directory.
%SYSFUNC(DNUM(directory-id))
DOPENopens a directory.
%SYSFUNC(DOPEN(fileref))
DOPTNAMEreturns a specified directory attribute.
%SYSFUNC(DOPTNAME(directory-id,nval))
DOPTNUMreturns the number of information items available for a directory.%SYSFUNC(DOPTNUM(directory-id))
DREADreturns the name of a directory member.
%SYSFUNC(DREAD(directory-id,nval))
DROPNOTEdeletes a note marker from a SAS data set or an external file.
%SYSFUNC(DROPNOTE(data-set-id|file-id,note-id))
DSNAMEreturns the data set name associated with a data set identifier.
%SYSFUNC(DSNAME(<data-set-id>))
EXISTverifies the existence of a SAS data library member.%SYSFUNC(EXIST(member-name<,member-type>))
FAPPENDappends a record to the end of an external file.
%SYSFUNC(FAPPEND(file-id<,cc>))
FCLOSEcloses an external file, directory, or directory member.
%SYSFUNC(FCLOSE(file-id))
FCOLreturns the current column position in the File Data Buffer (FDB)
%SYSFUNC(FCOL(file-id))
FDELETEdeletes an external file. %SYSFUNC(FDELETE(fileref))
FETCHreads the next nondeleted observation from a SAS data set into the Data Set Data Vector (DDV).
%SYSFUNC(FETCH(data-set-id<,'NOSET'>))
FETCHOBSreads a specified observation from a SAS data set into the DDV.%SYSFUNC(FETCHOBS(data-set-id,obs-number<,options>))
FEXISTverifies the existence of an external file associated with a fileref.%SYSFUNC(FEXIST(fileref))
FGETcopies data from the FDB. %SYSFUNC(FGET(file-id,cval<,length>))
FILEEXISTverifies the existence of an external file by its physical name.
%SYSFUNC(FILEEXIST(file-name))
FILENAMEassigns or deassigns a fileref for an external file, directory, or output device.
%SYSFUNC(FILENAME(fileref,file-name<,device<,host-options<,dir-ref>>>))
FILEREFverifies that a fileref has been assigned for the current SAS session.%SYSFUNC(FILEREF(fileref))
FINFOreturns a specified information item for a file.
%SYSFUNC(FINFO(file-id,info-item))
FNOTEidentifies the last record that was read.
%SYSFUNC(FNOTE(file-id))
FOPENopens an external file.
%SYSFUNC(FOPEN(fileref<,open-mode<,record-length<,record-format>>>))
FOPTNAMEreturns the name of an information item for an external file.
%SYSFUNC(FOPTNAME(file-id,nval))
FOPTNUMreturns the number of information items available for an external file.
%SYSFUNC(FOPTNUM(file-id))
FPOINTpositions the read pointer on the next record to be read.%SYSFUNC(FPOINT(file-id,note-id))
FPOSsets the position of the column pointer in the FDB.
%SYSFUNC(FPOS(file-id,nval))
FPUTmoves data to the FDB of an external file starting at the current column position.
%SYSFUNC(FPUT(file-id,cval))
FREADreads a record from an external file into the FDB.%SYSFUNC(FREAD(file-id))
FREWINDpositions the file pointer at the first record. %SYSFUNC(FREWIND(file-id))
FRLENreturns the size of the last record read, or the current record size for a file opened for output.
%SYSFUNC(FRLEN(file-id))
FSEPsets the token delimiters for the FGET function.
%SYSFUNC(FSEP(file-id,cval))
FWRITEwrites a record to an external file.
%SYSFUNC(FWRITE(file-id<,cc>))
GETOPTIONreturns the value of a SAS system or graphics option.%SYSFUNC(GETOPTION(option-name<,reporting-options<,...>>))
GETVARCassigns the value of a SAS data set variable to a character DATA step or macro variable.
%SYSFUNC(GETVARC(data-set-id,var-num))
GETVARNassigns the value of a SAS data set variable to a numeric DATA step or macro variable. %SYSFUNC(GETVARN(data-set-id,var-num))
LIBNAMEassigns or deassigns a libref for a SAS data library.
%SYSFUNC(LIBNAME(libref<,SAS-data-library<,engine<,options>>>))
LIBREFverifies that a libref has been assigned.
%SYSFUNC(LIBREF(libref))
MOPENopens a directory member file.
%SYSFUNC(MOPEN(directory-id,member-name<open-mode<,record-length<,record-format>>>))
NOTEreturns an observation ID for current observation of a SAS data set.
%SYSFUNC(NOTE(data-set-id))
OPENopens a SAS data file.
%SYSFUNC(OPEN(<data-file-name<,mode>>))
PATHNAMEreturns the physical name of a SAS data library or an external file.
%SYSFUNC(PATHNAME(fileref))
POINTlocates an observation identified by the NOTE function.
%SYSFUNC(POINT(data-set-id,note-id))
REWINDpositions the data set pointer to the beginning of a SAS data set.
%SYSFUNC(REWIND(data-set-id))
SPEDISreturns a number for the operation required to change an incorrect keyword in a WHERE clause to a correct keyword.
%SYSFUNC(SPEDIS(query,keyword))
SYSGETreturns the value of the specified host environment variable.
%SYSFUNC(sysget(host-variable))
SYSMSGreturns the error or warning message produced by the last function that attempted to access a data set or external file.
%SYSFUNC(SYSMSG())
SYSRCreturns the system error number or exit status of the entry most recently called.
%SYSFUNC(SYSRC())
VARFMTreturns the format assigned to a data set variable.
%SYSFUNC(VARFMT(data-set-id,var-num))
VARINFMTreturns the informat assigned to a data set variable.%SYSFUNC(VARINFMT(data-set-id,var-num))
VARLABELreturns the label assigned to a data set variable.
%SYSFUNC(VARLABEL(data-set-id,var-num))
VARLENreturns the length of a data set variable.
%SYSFUNC(VARLEN(data-set-id,var-num))
VARNAMEreturns the name of a data set variable.
%SYSFUNC(VARNAME(data-set-id,var-num))
VARNUMreturns the number of a data set variable.
%SYSFUNC(VARNUM(data-set-id,var-name))
VARTYPEreturns the data type of a data set variable.
%SYSFUNC(VARTYPE(data-set-id,var-num))