SAS 命令行 - 部分程序执行

SAS Command Line - Partial Program Execution

我正在使用 运行SASJob 在 UNIX 环境中执行 SAS 程序。

我想知道是否有办法从命令行执行一部分 SAS 程序。

例如,假设我有一个 100 行的 SAS 程序,并且该程序中有一个数据步骤占用了第 5-10 行。

我可以只从命令行 运行 第 5-10 行吗?

谢谢

您有多种选择:

  1. 将感兴趣的 5 行拆分成一个单独的文件,然后在原来的 100 行程序中用 %include 语句替换它们
  2. 同上,但使用自动调用宏或存储的编译宏
  3. 编写一个数据步骤,将 100 行 .sas 文件作为输入,仅输出您想要的 5 行,并 %include 它 - 如果您没有对您想要的文件的写入权限,这很有用 运行 来自的 5 行,并且您不想维护单独的副本。
  4. 如果您已经在同一个会话中执行了整个 100 行程序,设置了 option spool,并且您知道日志中 5 个所需行占用的行号,您可以通过重播这些行%include 语句。

对于选项 3,示例数据步骤可能如下所示:

%let SHORTFILE = %sysfunc(pathname(work))/shortfile.sas;

data _null_;
  infile "/path/to/100/line/file.sas" obs = 10 firstobs=5 lrecl = 32767;
  file "&SHORTFILE" lrecl= 32767;
  input;
  put _infile_;
run;

%include "&SHORTFILE";

如果您胆子大,并且真的不想创建额外的临时文件,则可以使用 call execute 来代替:

data _null_;
  infile "/path/to/100/line/file.sas" obs = 10 firstobs=5 lrecl = 32767;
  input;
  call execute(_infile_);
run;

下面的宏应该可以解决这个问题和一些类似的问题:

%macro runMacroFromEnv
/des='Set the environment value RUNMACRO to run a macro'; 
    %if %sysfunc( envlen( RUNMACRO ) ) > 0 %then %sysget( RUNMACRO );
%mend;

例如:如果您有以下文件:

%macro foo;
   %put I just ran foo;
%mend;

%macro runMacroFromEnv
/des='Set the environment value RUNMACRO to run a macro'; 
    %if %sysfunc( envlen( RUNMACRO ) ) > 0 %then %sysget( RUNMACRO );
%mend;

%runMacroFromEnv;

并调用 SAS:

sas runMacro.sas -set RUNMACRO %foo

然后在你日志的某处,你会看到:

I just ran foo

一些重要的细节:

  • 使用 -set 在 Unix 和 Windows
  • 中(至少)有效
  • 根据您的 shell
  • ,还有其他设置环境变量的机制
  • 不要忘记 -set RUNMACRO %foo
  • 中的 %
  • 有关详细信息,请参阅 The set system option