在 if 条件下调用不同的调用执行 - SAS
Calling different call execute on if condition - SAS
我的意图是使用调用执行基于 'frame' 数据集分两步构建数据集。我需要 'a_dataset'。它不存在。
我阅读了 'frame' 数据集的行:
在第一行,因为 'a_dataset' 不存在,所以我做宏 nexds。
'frame' 的第二行,我检查 'a_dataset' 是否存在,我找到了它并且我做了宏 exds.
很遗憾,我的代码无法正常工作。对于 'frame' 中的每一行,存在条件始终为假,并且它运行两次 nexds 宏。
DATA WORK.frame;
INFILE DATALINES4
/*DLM='7F'x*/
DLM=' '
MISSOVER
DSD ;
INPUT
from : $CHAR25.
tojoin : $CHAR7. ;
DATALINES4;
dataset join1
dataset join2
;;;;
proc delete data=a_dataset;run;
%macro exds(dsn,varname);
data &dsn.;
set &dsn.;
&varname. = 'exist';
run;
%mend;
%macro nexds(dsn,varname);
data &dsn.;
&varname. = 'notexist';
run;
%mend;
data _null_;
set frame;
name = strip(tojoin);
dsname = cat('a_',strip(from));
if ~exist(dsname) then put 'notexist';
else put 'exist';
if ~exist(dsname) then call execute('%nexds('||dsname||','||name||')');
else call execute('%exds('||dsname||','||name||')');
run;
它运行这两行代码:
1 + data a_dataset; join1 = 'notexist'; run;
2 + data a_dataset; join2 = 'notexist'; run;
相反,我想要:
1 + data a_dataset; join1 = 'notexist'; run;
2 + data a_dataset; set a_dataset; join2 = 'exist'; run;
在 put 调用的日志中:
notexist
notexist
似乎在 'frame' 的每一行开始时检查 if 条件,而不是在每行之后检查 'frame'.
的单行
您不了解 CALL EXECUTE() 的工作原理。当前步骤完成后,您生成的代码最多存储 运行。
由于 FRAME 中的两个观察值都具有相同的 FROM 值,因此对于数据集是否存在的测试两次都具有相同的值,因为第一个观察值生成的任何代码都没有机会 运行 还.
将测试和分支逻辑移到宏中。
DATA frame;
INPUT from :. tojoin :. ;
DATALINES4;
dataset join1
dataset join2
;;;;
%macro make(dsn,varname);
data &dsn ;
%if %sysfunc(exist(&dsn)) %then %do;
set &dsn;
&varname = 'exist';
%end;
%else %do;
&varname = 'notexist';
%end;
run;
%mend make;
proc delete data=a_dataset;run;
options mprint;
data _null_;
set frame;
call execute(cats('%nrstr(%make)(', 'a_', from, ',' , tojoin, ')' ));
run;
我的意图是使用调用执行基于 'frame' 数据集分两步构建数据集。我需要 'a_dataset'。它不存在。 我阅读了 'frame' 数据集的行: 在第一行,因为 'a_dataset' 不存在,所以我做宏 nexds。 'frame' 的第二行,我检查 'a_dataset' 是否存在,我找到了它并且我做了宏 exds.
很遗憾,我的代码无法正常工作。对于 'frame' 中的每一行,存在条件始终为假,并且它运行两次 nexds 宏。
DATA WORK.frame;
INFILE DATALINES4
/*DLM='7F'x*/
DLM=' '
MISSOVER
DSD ;
INPUT
from : $CHAR25.
tojoin : $CHAR7. ;
DATALINES4;
dataset join1
dataset join2
;;;;
proc delete data=a_dataset;run;
%macro exds(dsn,varname);
data &dsn.;
set &dsn.;
&varname. = 'exist';
run;
%mend;
%macro nexds(dsn,varname);
data &dsn.;
&varname. = 'notexist';
run;
%mend;
data _null_;
set frame;
name = strip(tojoin);
dsname = cat('a_',strip(from));
if ~exist(dsname) then put 'notexist';
else put 'exist';
if ~exist(dsname) then call execute('%nexds('||dsname||','||name||')');
else call execute('%exds('||dsname||','||name||')');
run;
它运行这两行代码:
1 + data a_dataset; join1 = 'notexist'; run;
2 + data a_dataset; join2 = 'notexist'; run;
相反,我想要:
1 + data a_dataset; join1 = 'notexist'; run;
2 + data a_dataset; set a_dataset; join2 = 'exist'; run;
在 put 调用的日志中:
notexist
notexist
似乎在 'frame' 的每一行开始时检查 if 条件,而不是在每行之后检查 'frame'.
的单行您不了解 CALL EXECUTE() 的工作原理。当前步骤完成后,您生成的代码最多存储 运行。
由于 FRAME 中的两个观察值都具有相同的 FROM 值,因此对于数据集是否存在的测试两次都具有相同的值,因为第一个观察值生成的任何代码都没有机会 运行 还.
将测试和分支逻辑移到宏中。
DATA frame;
INPUT from :. tojoin :. ;
DATALINES4;
dataset join1
dataset join2
;;;;
%macro make(dsn,varname);
data &dsn ;
%if %sysfunc(exist(&dsn)) %then %do;
set &dsn;
&varname = 'exist';
%end;
%else %do;
&varname = 'notexist';
%end;
run;
%mend make;
proc delete data=a_dataset;run;
options mprint;
data _null_;
set frame;
call execute(cats('%nrstr(%make)(', 'a_', from, ',' , tojoin, ')' ));
run;