任何人都可以提供建议或逐步解决以下问题。
我面临的问题是,我在一项研究中有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;
答案 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(来自文档)。