2014-09-13 2 views
0

나는 매일 01/01/2012 및 2012년 1월 2일에 대한 예를 들어 다음과 같은 형식으로 이름을 SAS 데이터 세트 가지고 :SAS 데이터 세트를 입력하여 연례 데이터 세트에 추가하는 매크로 코드를 작성하는 방법은 무엇입니까?

daily_01jan12 및 daily_02jan12

을 나는 매년 이러한 모든 데이터 세트를 추가해야합니다

데이터 세트. SAS에서 매크로를 사용하여이 코드를 작성하는 효율적인 방법은 무엇입니까?

내가 지금 가지고있는 것은 아래에 있습니다. 그러나, 나는 그것을 365 번 할 필요가 있고, 나는 더 좋은 길을 가져야한다고 확신한다.

도움을 주시면 감사하겠습니다. 고맙습니다. 당신은 데이터 세트 및 라이브러리는 사람이 당신이 뭔가를 할 수있는 다음 추가 할 포함의 순서에 대해 걱정하지 않는 경우

data libw.daily01Jan2012; 
set libw.daily_01Jan2012; 
Day=1; 
Month=1; 
Year=2012; 

data libw.daily02Jan2012; 
set libw.daily_02Jan2012; 
Day=2; 
Month=1; 
Year=2012; 

proc append base=libw.daily01Jan2012 data=libw.daily02Jan2012; 
run; 

답변

2

다음

data want(drop=dt); 
    set libw.daily_: indsname=ds_name open=defer; 

    dt = input(scan(ds_name, 2, "_"), date9.); 
    day = day(dt); 
    month = month(dt); 
    year = year(dt); 
run; 

을 수행해야하는 경우 먼저 데이터 세트를 정렬하거나 필터링하여 proc sql을 사용하여 모든 데이터 세트 이름으로 매크로 변수를 만들 수 있습니다.

proc sql noprint; 
    select distinct catx('.', libname, memname) into :ds_list separated by ' ' 
    from sashelp.vcolumn 
    where 
     memtype = 'DATA' and 
     libname = 'LIBW' and 
     memname like 'DAILY^_%' escape '^' and 
     input("01JAN2012", date9.) le input(scan(memname, 2, "_"), date9.) lt input("01JAN2013", date9.) 
    order by input(scan(memname, 2, "_"), date9.); 
quit; 

data want(drop=dt); 
    set &ds_list indsname=ds_name open=defer; 

    dt = input(scan(ds_name, 2, "_"), date9.); 
    day = day(dt); 
    month = month(dt); 
    year = year(dt); 
run; 
+0

** N.B ** indsname 옵션은 SAS 9.2 이상에서만 사용할 수 있습니다. 이전 버전을 사용하는 사람들은 일부 배열 처리와 함께 in =을 사용해야합니다. – user667489

1

모든 데이터 세트가 하나의 라이브러리에 있고 폴더의 유일한 데이터 세트 인 경우 다음과 같이 할 수 있습니다.

매일 후 콜론은 SAS가 매일 시작하는 모든 파일을 포함하도록합니다.

indsname 옵션을 사용하면 파일 이름을 저장할 수 있으며 이름의 날짜 부분을 추출 할 수 있습니다.

일, 월, 연도를 알아야하는 경우 관련 함수가있는 항목을 추출 할 수도 있지만 일반적으로 단일 날짜 변수 만 있으면됩니다. 테스트되지 않음 :

data annual; 
    set libw.daily: indsname=source; 
    date=input(substr(source, 10, 9), date9.); 
run; 
관련 문제