SAS如果宏var是eq到string然后是filename

时间:2017-07-27 10:09:20

标签: sas datastep

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

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;

我做错了什么?

2 个答案:

答案 0 :(得分:3)

filename是一个全局声明,不应包含在datastep中。

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

%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;

答案 1 :(得分:0)

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