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

SAS如果宏变量等于字符串,则为文件名,sas,datastep,Sas,Datastep,我有一个关于if/then结构和(过度)编写文件的基本问题 My&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;

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

My&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,\/);