使用 %include 为不同站点自动化 SAS 程序
Automate SAS program for different sites using %include
我遇到的问题是,我在多个站点上使用同一个程序进行报告。我必须 运行 每个人的代码。我正在寻求自动化我的流程以一次性为所有站点调用代码和 运行。这是我尝试使用的代码,但它不起作用。
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 中的代码可以独立运行。我定义了一个名为 site 的宏变量,它将代码的站点设置为 运行.
我一直收到的错误是 'ERROR 117-185: There was 1 unclosed DO block.'
谢谢
所以您希望包含基于先前数据集的不同文件。我建议您创建文件而不是从数组中读取它,但要保持您最初请求的精神:
%let basePath= c:\foo;
data _NULL_;
array sites {2} . ('SiteA' , 'SiteB');
do k = 1 to dim(sites);
site = sites(k);
call execute('%nrstr(%put &basePath.\'||site||';)');
end;
run;
这会产生
c:\foo\SiteA
c:\foo\SiteB
您可以轻松地将 %put 命令替换为 %include
来完成您想要的。
编辑:我建议您改为尝试这样做:
data includes;
format path . file .;
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;
你应该这样做:
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
有了宏功能就简单了。您可以用 %put 替换 %include。
您可以使用此技术从数据集中获取站点列表:
data test;
infile datalines dsd;
input site : 0. ;
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;
此致
如果网站不经常更改,并且网站数量不多,这可能是最简单的方法:
%let site=siteA;
%include '...path\SitesWait.sas';
%let site=siteB;
%include '...path\SitesWait.sas';
%let site=siteC;
%include '...path\SitesWait.sas';
不过要小心。您可能希望在 'resets' SAS 会话的 SitesWait.sas 顶部包含代码。 IE。清除您计划使用的任何宏值,删除工作文件夹中的任何数据集等。否则,对 SitesWait.sas
的第二次调用可能会受到先前 运行.
的影响
您不能在 DATA 步的中间包含另一个多步程序。 %include
只是将文件中的行放入程序流中,就好像这些行已输入到程序中一样。当 SAS 在包含的文件中看到第一个 DATA 或 PROC 语句时,它将停止编译主程序中的 DATA 步骤并 运行 它。这就是为什么您的 DO 循环看不到 END 语句的原因。
您可以只使用数据步骤来生成设置参数并包含程序的代码。
data _null_;
length site ;
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)
我遇到的问题是,我在多个站点上使用同一个程序进行报告。我必须 运行 每个人的代码。我正在寻求自动化我的流程以一次性为所有站点调用代码和 运行。这是我尝试使用的代码,但它不起作用。
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 中的代码可以独立运行。我定义了一个名为 site 的宏变量,它将代码的站点设置为 运行.
我一直收到的错误是 'ERROR 117-185: There was 1 unclosed DO block.'
谢谢
所以您希望包含基于先前数据集的不同文件。我建议您创建文件而不是从数组中读取它,但要保持您最初请求的精神:
%let basePath= c:\foo;
data _NULL_;
array sites {2} . ('SiteA' , 'SiteB');
do k = 1 to dim(sites);
site = sites(k);
call execute('%nrstr(%put &basePath.\'||site||';)');
end;
run;
这会产生
c:\foo\SiteA
c:\foo\SiteB
您可以轻松地将 %put 命令替换为 %include
来完成您想要的。
编辑:我建议您改为尝试这样做:
data includes;
format path . file .;
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;
你应该这样做:
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
有了宏功能就简单了。您可以用 %put 替换 %include。
您可以使用此技术从数据集中获取站点列表:
data test;
infile datalines dsd;
input site : 0. ;
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;
此致
如果网站不经常更改,并且网站数量不多,这可能是最简单的方法:
%let site=siteA;
%include '...path\SitesWait.sas';
%let site=siteB;
%include '...path\SitesWait.sas';
%let site=siteC;
%include '...path\SitesWait.sas';
不过要小心。您可能希望在 'resets' SAS 会话的 SitesWait.sas 顶部包含代码。 IE。清除您计划使用的任何宏值,删除工作文件夹中的任何数据集等。否则,对 SitesWait.sas
的第二次调用可能会受到先前 运行.
您不能在 DATA 步的中间包含另一个多步程序。 %include
只是将文件中的行放入程序流中,就好像这些行已输入到程序中一样。当 SAS 在包含的文件中看到第一个 DATA 或 PROC 语句时,它将停止编译主程序中的 DATA 步骤并 运行 它。这就是为什么您的 DO 循环看不到 END 语句的原因。
您可以只使用数据步骤来生成设置参数并包含程序的代码。
data _null_;
length site ;
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)