SAS 命令行 - 部分程序执行
SAS Command Line - Partial Program Execution
我正在使用 运行SASJob 在 UNIX 环境中执行 SAS 程序。
我想知道是否有办法从命令行执行一部分 SAS 程序。
例如,假设我有一个 100 行的 SAS 程序,并且该程序中有一个数据步骤占用了第 5-10 行。
我可以只从命令行 运行 第 5-10 行吗?
谢谢
您有多种选择:
- 将感兴趣的 5 行拆分成一个单独的文件,然后在原来的 100 行程序中用 %include 语句替换它们
- 同上,但使用自动调用宏或存储的编译宏
- 编写一个数据步骤,将 100 行 .sas 文件作为输入,仅输出您想要的 5 行,并 %include 它 - 如果您没有对您想要的文件的写入权限,这很有用 运行 来自的 5 行,并且您不想维护单独的副本。
- 如果您已经在同一个会话中执行了整个 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
我正在使用 运行SASJob 在 UNIX 环境中执行 SAS 程序。
我想知道是否有办法从命令行执行一部分 SAS 程序。
例如,假设我有一个 100 行的 SAS 程序,并且该程序中有一个数据步骤占用了第 5-10 行。
我可以只从命令行 运行 第 5-10 行吗?
谢谢
您有多种选择:
- 将感兴趣的 5 行拆分成一个单独的文件,然后在原来的 100 行程序中用 %include 语句替换它们
- 同上,但使用自动调用宏或存储的编译宏
- 编写一个数据步骤,将 100 行 .sas 文件作为输入,仅输出您想要的 5 行,并 %include 它 - 如果您没有对您想要的文件的写入权限,这很有用 运行 来自的 5 行,并且您不想维护单独的副本。
- 如果您已经在同一个会话中执行了整个 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
%