关键词:命令行 批处理 报表自动化SYSPARM
在日常SAS编程与运行过程中,我们往往会采用Command Line(命令行)的方式来运行单个或多个SAS程序(也称Batch Run,批量运行),这种方式具有系统资源占用少、运行快、并可充分利用多核CPU来实现多线程、多任务运行等特点,从而达到提高程序运行效率,节省程序运行时间等目的。另外,命令行运行SAS程序也是实现程序自动化运行、报表自动化的重要实现方式。
如何实现参数的有效传递是在命令行或批量运行程序时经常要考虑的一个问题。例如,根据用户提供的不同项目编号和分析时间段产生相应的自动分析报表等。下面是实现参数传递的几种不同方法:
方法1:通过命令行选项 -sysparm
示例:sas.exe -sysin “/home/temp/test.sas" -sysparm 'PROJECTID STUDYID 2018-01-01 2018-06-30'
调用:在SAS程序中通过%scan函数分别提取相应参数值并传递给相应宏变量:
%let PROJECTID =%scan(&sysparm,1);
%let STUDYID=%scan(&sysparm,2);
%let STDTC=%scan(&sysparm,3);
%let ENDTC=%scan(&sysparm,4);
注:当只传递一个不含空格参数值时,引号可省略;常用空格作为分隔符;如果参数本身含空格或有多个参数,则需要添加引号,必要时使用用其它分隔符,比如|或#等,注意此时需要在相应的%scan语句中作相应的修改。
本方法使用较多,借助系统宏变量&sysparm来传递参数,适用于参数名比较固定且数量较少的情况。
方法2:通过命令行选项 -set 设置环境变量
示例:sas.exe -sysin “/home/temp/test.sas" -set PROJECTID "ABC001" -set STUDYID "ABC001A001" -set STDTC "2018-01-01" -set ENDTC "2018-06-30"
调用:
%let PROJECTID = %sysget(PROJECTID );
%let STUDYID = %sysget(STUDYID );
%let STDTC= %sysget(STDTC );
%let ENDTC = %sysget(ENDTC );
注:此种方法借助环境变量来传递参数,需要使用%sysget函数来取,需要环境变量名与值配对使用。
方法3:通过EXPORT语句设置环境变量,适应于UNIX SAS
示例:
export PROJECTID=ABC001;
export STUDYID=ABC001A001;
export STDTC=2018-01-01;
export ENDTC=2018-06-30ABC001A001;
调用:
data _env;
infile 'env' pipe;
input ENV $255.;
run;
注:不同UNIX环境可能具体设置稍有不同。另外,上述调用默认会将所有当前系统环境变量提取,用户需要对所读取环境变量进行筛选和转换,必要时可以结合使用call symputx语句来实现(在以后的具体实例应用介绍中会有详细说明)。
方法4:通过自动配置程序文件来传递参数(autoexec.sas,可用任意名称,但需在命令行通过选项-autoexec指定, 此处不同于所需运行的主程序),必要时可通过宏程序或脚本文件动态修改此文件与命令行,来实现不同参数传递目的。
本文简要总结了几种在命令行或批处理运行SAS程序时如何传递参数的几种常用方法,希望对大家在日常编程工作当中有所帮助或启发,另外用户也可结合UNIX下的CRONTAB JOB、WINDOWS下的任务管理器或Putty远程桌面命令来实现条件报表自动化应用。我们也会在以后的文章中更具体的分享上述方法的实际应用案例。
如果您有更好的方法,也欢迎投稿或留言与大家分享~~
西铁房——临床试验爱好者公众号
微信号:clinicaltrialfans
领取专属 10元无门槛券
私享最新 技术干货