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,\/);
我有一个关于 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,\/);