动态选择autoexec文件以在SAS中进行批处理

时间:2015-02-04 09:47:49

标签: sas

任何人都可以提供建议或逐步解决以下问题。

我面临的问题是,我在一项研究中有2组原始数据,一组用于MRD,一组用于Neuro。我创建了2个单独的autoexec文件,以便将正确的数据读入交互式SAS会话。但是,当涉及到批处理程序时,SAS不会为数据分配正确的库位置。

我需要做的是扫描正在为MRD或Neuro批处理的文件的目录路径,然后指示批处理过程使用关联的autoexec.sas文件进行MRD或Neuro。所有这些都需要在批处理过程开始之前发生,以便分配正确的库。

我公司加载autoexec.sas文件的过程如下: 1. SAS快捷方式包括对名为biosetup.inc的文件的自定义调用。 2. Biosetup.inc包含autoexec.sas文件的研究路径目录。 3. Autoexec.sas分配要在交互式SAS会话中使用的库名称和路径,以及设置宏的路径等。

我认为我需要解决的方法是在biosetup.inc中创建一个宏,它将分配正确的autoexec文件。

这一切都可能吗?

到目前为止,我已经能够确定目录路径等,现在我还需要做的是确保正在使用正确的autoexec文件。

%macro MAIN;
%let proctype = %scan(&SYSPROCESSNAME,1,%str( ));

/*Define macro variable for the path and filename*/
%if &proctype = DMS
%then %let pathpgmref=%sysget(SAS_EXECFILEPATH);
%else %let pathpgmref=%sysfunc(GetOption(SYSIN));

/*Define separate macro variables for the filename.extension, filename, and extension*/
/*Reverse path and filename to scan from the front (back)*/
%let pathpgmref = %sysfunc(reverse(&pathpgmref));
%let pgmextref = %scan(&pathpgmref,1,\);
%let extref = %scan(&pgmextref,1,.);

/*Reverse back to proper order*/
%let pathpgmref = %sysfunc(reverse(&pathpgmref));
%let pgmextref = %sysfunc(reverse(&pgmextref));
%let extref = %sysfunc(reverse(&extref));
%let pgmref = %scan(&pgmextref,1,.);

/*Remove filename to create program directory macro variable*/

%let temp = %eval(%index(&pathpgmref,&pgmref) - 1);
%let pathref = %substr(&pathpgmref,1,&temp);

%let PATH = %sysfunc(quote(&pathref));
%let EXTN = %sysfunc(quote(&extref));
%let PGMN = %sysfunc(quote(&pgmref));

Data _Null_;
    if index(&PATH,"MRD") and lowcase(&EXTN) = "sas" then call symput("DATATYPE","MRD");        
    else if index(&PATH,"NEURO") and lowcase(&EXTN) = "sas" then call symput("DATATYPE","NEURO");
    else if index(&PATH,"Listings") or index(&PATH,"Tables") and lowcase(&EXTN) = "sas" then do;
        if lowcase(substr(reverse(&PGMN),1,1)) = "a" then call symput("DATATYPE","MRD");
        if lowcase(substr(reverse(&PGMN),1,1)) = "b" then call symput("DATATYPE","NEURO");
    end;
Run;

%if &DATATYPE = "MRD" %then %do;
    %include "MRD_Setup.sas";
%end;
%if &DATATYPE = "NEURO" %then %do;
    %include "NEU_Setup.sas";
%end;

%put ProcType: &proctype;
%put FullPath: &pathpgmref;
%put DirePath: &pathref;
%put FullFile: &pgmextref;
%put FileName: &pgmref;
%put ExtnType: &extref;
%put DataType: &DATATYPE;
%mend;

%MAIN;

1 个答案:

答案 0 :(得分:1)

我建议只通过-SYSPARM命令行选项传递一个参数。

sas mysasfile.sas -AUTOEXEC biosetup.inc -SYSPARM "path_of_autoexec_to_run"

然后在你的sas程序中,我认为你应该能够做到这一点:

%include "&sysparm";

这假定您目前没有使用-SYSPARM进行其他任何操作。它还假设您有2个快捷方式,每个研究1个。从您的问题来看,这听起来就像是目前的设置。

我没有对此进行过测试,但理论上这应该可行。

Here's a working example(来自文档)。