【问题标题】:Dynamically selecting an autoexec file for batch processing in SAS在 SAS 中动态选择用于批处理的 autoexec 文件
【发布时间】:2015-02-04 09:47:48
【问题描述】:

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

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

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

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

我认为我需要解决此问题的方法是在 biosetup.inc 中创建一个宏,该宏将分配正确的自动执行文件。

这可能吗?

到目前为止,我已经能够确定目录路径等,现在我还需要确保使用正确的 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;

【问题讨论】:

  • 当您说“扫描目录路径”时,您的意思是 determine what the path to the .sas file is?

标签: sas


【解决方案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(来自文档)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    相关资源
    最近更新 更多