SAS 如果宏变量等于字符串则文件名

SAS if macro var is eq to string then filename

我有一个关于 if/then 结构和(改写)文件的基本问题。

我的 &name var 设置为 name_b,但 aa.js 总是被覆盖并且 bb.js.

data _null_;
if "&name" = "name_a" then do;
   filename cd_file '\path\aa.js';
end; 
else if "&name" = "name_b" then do;
   filename cd_file '\path\bb.js';
end;
run;

我做错了什么?

filename 是全局语句,不应包含在数据步骤中。

您可以改用宏逻辑 - 例如:

%macro example();
  %let name=name_a;  /* as appropriate */
  %if &name = name_a %then %do;
    filename cd_file '\path\aa.js';
  %end; 
  %else %if &name = name_b %then %do;
    filename cd_file '\path\bb.js';
  %end;
%mend;

FILENAME 语句不可执行,因此它们将在编译数据步骤时发生。因此,当您的 IF 语句运行时,两个 FILENAME 语句都已经执行。

您可以改用 FILENAME() 函数。

运行 这个例子可以看出使用 FILENAME() 函数使赋值成为条件。

%let name=name_a;
%let path=%sysfunc(pathname(work));

data _null_;
if "&name" = "name_a" then do;
   filename cd_file "&path/aa.js";
end; 
else if "&name" = "name_b" then do;
   filename cd_file "&path/bb.js";
end;
run;

%put CD_FILE -> %scan(%sysfunc(pathname(cd_file)),-1,\/);

data _null_;
if "&name" = "name_a" then do;
   rc=filename('cd_file',"&path/aa.js");
end; 
else if "&name" = "name_b" then do;
   rc=filename('cd_file',"&path/bb.js");
end;
run;

%put CD_FILE -> %scan(%sysfunc(pathname(cd_file)),-1,\/);