2017-11-17 25 views
0

문제점은 여러 사이트의 보고서에 동일한 프로그램을 사용한다는 것입니다. 개별적으로 코드를 실행해야합니다. 코드를 호출하고 이동 중에 모든 사이트에 대해 실행하는 프로세스를 자동화하려고합니다. 이것은 사용하려고 시도했지만 작동하지 않는 코드입니다.% include를 사용하여 여러 사이트에 대해 SAS 프로그램을 자동화합니다.

data _null_; 
array sites {2} _temporary_ (SiteA SiteB); 

do k = 1 to dim(sites); 
    %let site = sites(k); 

    %include '...path\SitesWait.sas'; 

end; run; 

SiteWait의 코드는 완벽하게 작동합니다. 사이트라는 코드를 실행할 사이트를 설정하는 매크로 변수를 정의했습니다.

계속 오류가 발생합니다. '오류 117-185 : 차단되지 않은 DO 블록이 1 개 있습니다.'

감사합니다.

+0

그다지 의미가 없습니다. 나는 당신이 어떤 매개 변수를 전달해야한다고 가정하고, 그렇지 않으면 프로그램은 단지 여러 번 실행 중이다. – Reeza

+0

전달할 유일한 매개 변수는 'site'입니다.이 매크로는 프로그램에서 사용됩니다. SitesWait.sas – Kany

+1

매크로 만들기 및 사이트 매개 변수로 전달 – NEOmen

답변

1

DATA 단계의 중간에 다른 다 단계 프로그램을 포함시킬 수 없습니다. %include은 파일이 프로그램에 입력 된 것처럼 프로그램 스트림에 파일의 행을 넣기 만합니다. SAS가 포함 된 파일에서 첫 번째 DATA 또는 PROC 문을 볼 때 주 프로그램에서 DATA 단계 컴파일을 중지하고 실행합니다. 그래서 DO 루프가 END 문을 보지 못합니다.

매개 변수를 설정하고 프로그램을 포함하는 코드를 생성하기 위해 데이터 단계 만 사용할 수 있습니다.

data _null_; 
    length site $20 ; 
    do site='SiteA','SiteB' ; 
    call execute(cats('%nrstr(%let) site=',site,';')); 
    call execute("%include '...path\SitesWait.sas';"); 
    end; 
run; 

기본적으로 생성 한 것은 SITE라는 단일 매개 변수가있는 매크로입니다. 실제로 % INCLUDE를 매크로 정의의 본문으로 사용할 수 있습니다. 그런 다음 일부 값 목록을 처리하는 대신 원하는 호출을 코딩 할 수 있습니다.

%macro siteswait(site); 
%include '...path\SitesWait.sas'; 
%mend; 
%siteswait(SiteA) 
%siteswait(SiteB) 
1

이전 데이터 세트를 기반으로 다른 파일을 포함하고자합니다. 난 당신이 대신 배열을 읽는 파일을 만들 제안하지만 초기 요청의 정신을 유지 : \ foo는 \ 사이트 A

C :

%let basePath= c:\foo; 

data _NULL_; 
    array sites {2} $5. ('SiteA' , 'SiteB'); 

    do k = 1 to dim(sites); 
     site = sites(k); 
     call execute('%nrstr(%put &basePath.\'||site||';)'); 
    end; 
run; 

C를 생성합니다 : \ 당신은 쉽게 당신이 원하는 것을 달성하기 위해 %include과 함께 %의 put 명령을 대체 할 수

foo는 \ 사이트 B.

편집 :

data includes; 
    format path $30. file $10.; 
    input path $ file $; 
    cards; 
    c:\foo\ file1.sas 
    c:\foo\ file2.sas 
    c:\Bar\ file1.sas 
    c:\Bar\ file2.sas 
; run; 

data _null_; 
    set includes; 
     call execute('%nrstr(%put '||strip(path)||''||strip(file)||';)'); 
run; 
1

당신은 다음과 같이 수행해야합니다 :

main.sas 

%macro ProcessList; 
    %let list_of_site=SiteA|SiteB|SiteC; 
    %let k=1; 
    %do %while (%qscan(&list_of_site, &k,|) ne); 
     %let site = %scan(&list_of_site, &k,|); 
     %include 'H:\desktop\SAS\test_inc.sas'; 
     /*%put site=&site;*/ 
     %let k = %eval(&k + 1); 
    %end; 


%mend ProcessList; 
%processList; 


test_inc.sas 

%put site=&site; 

결과 :

site=SiteA 
site=SiteB 
site=SiteC 

난 당신이 대신 수행하려고 제안 무엇이이 같은 것입니다 매크로 기능을 사용하면 간단합니다. % include를 % put으로 바꿀 수 있습니다.

당신은이 기술로 데이터 세트에서 사이트의 목록을 얻을 수

:

data test; 
infile datalines dsd; 
    input site : $200. ; 
    datalines; 
SiteA, 
SiteB, 
SiteC, 
SiteD, 
SiteE, 
SiteF, 
; 
run; 

proc sql noprint; 
    select quote(trim(site), "'") into : list_of_site separated by "|" from work.test; 
quit; 

감사

+0

첫 번째 부분이 내 문제를 해결했습니다. 감사 – Kany

0

사이트가 자주 변경되지 않는 경우, 그 중 너무 많은이없는 경우,이

%let site=siteA; 
%include '...path\SitesWait.sas'; 

%let site=siteB; 
%include '...path\SitesWait.sas'; 

%let site=siteC; 
%include '...path\SitesWait.sas'; 

그래도주의 : 가장 간단한 방법이 될 수 있습니다. SAS 세션을 '재설정'하는 SitesWait.sas의 상단에 코드를 포함 할 수 있습니다. 즉. 사용하려는 매크로 값을 지우고 작업 폴더의 데이터 세트를 삭제합니다. 그렇지 않으면 SitesWait.sas에 대한 두 번째 호출이 이전 실행의 영향을받을 수 있습니다.