我正在尝试向SAS Log打印一条语句,警告用户某些程序没有运行。为此,我使用put语句打印到SAS日志:
%let step1 = My program;
%let rec= cats(&step1.);
data _null_;
put "** &rec. did not run";
run;
put语句打印:“** cats(我的程序)没有运行”。有谁知道为什么猫的功能没有执行?我猜它与在SAS语句之前执行的宏代码有关,但我不知道如何使这项工作。
修改
感谢Reeza和Tom。现在我理解为什么这不起作用 - 我必须使用%sysfunc来使用数据步骤之外的函数,并且我不能在put语句中使用函数。
汤姆 - 你问了一个更完整的例子:我正在尝试将语句打印到SAS日志中,以便用户可以轻松查看已运行的程序以及跳过的程序。我正在努力实现以下目标:
data _null_;
array steps(*) $ step1-step7;
do i=1 to dim(steps);
if symget(cats('run',i)) = 'N' then
put "** The program "symget(cats('run',i)" did not run";
end;
run;
我想如果我能弄清楚如何在put语句中执行函数,这段代码就行了。但是,这是不可能的。不过,我应能够让变量改为“i”。
例如,当i为1时,put语句应为“程序file1.sas未运行”。
当我是2时,put语句应该是“程序file2.sas没有运行”,依此类推。
我尝试使用:
put "** The program &&step&i did not run";
但SAS无法识别我的变量。
希望这会提供更多背景信息!
答案 0 :(得分:2)
您可以添加%SYSFUNC()以使用数据步骤之外的功能,但在这种情况下,CATS不会向您的流程添加任何值。
%let step1 = My program;
%let rec= %sysfunc(cats(&step1.));
data _null_;
put "** &rec. did not run";
put "** &step1. did not run";
run;
输出:
293
294
295 %let step1 = My program;
296 %let rec= %sysfunc(cats(&step1.));
297
298 data _null_;
299 put "** &rec. did not run";
300 put "** &step1. did not run";
301 run;
** My program did not run
** My program did not run
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
答案 1 :(得分:1)
如果您正在运行宏,那么只需使用%DO
循环。
%do i=1 %to 7 ;
%if (N=&&run&i) %then %put NOTE: The program &&step&i did not run;
%end;
否则只需使用数据步骤变量并打印出来。
data _null_;
do i=1 to 7 ;
if symget(cats('run',i)) = 'N' then do;
length program $100 ;
program=symget(cats('step',i));
put 'NOTE: The program ' program 'did not run';
end;
end;
run;