【问题标题】:Calling different call execute on if condition - SAS在 if 条件下调用不同的调用执行 - SAS
【发布时间】:2021-07-28 21:14:41
【问题描述】:

我的意图是使用调用执行在基于“框架”数据集的两步过程中构建数据集。我需要'a_dataset'。它不存在。 我读了“框架”数据集的行: 在第一行,因为'a_dataset'不存在我做宏nexds。 'frame' 的第二行,我检查 'a_dataset' 是否存在,我找到它并进行宏扩展。

很遗憾,我的代码无法正常工作。对于 'frame' 中的每一行,存在条件始终为 false,它运行 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

似乎在“帧”的每一行的开头检查了 if 条件,而不是在每行读取“帧”的单行之后。

【问题讨论】:

  • 您可以尝试将 CALL EXECUTE() 切换为 DOSUBL() ,这会影响事情的运行时间。

标签: sas


【解决方案1】:

您不了解 CALL EXECUTE() 的工作原理。您生成的代码会存储起来,以便在当前步骤完成后运行。

由于 FRAME 中的两个观察值具有相同的 FROM 值,因此对于数据集是否存在的测试将具有相同的值,因为第一次观察生成的任何代码还没有机会运行。

将测试和分支逻辑移到宏中。

DATA frame;
   INPUT from :$25. tojoin  :$7. ;
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;

【讨论】:

  • 问题有点复杂,但是您公开的概念经过一些修改后奏效了!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 2015-06-13
  • 2018-04-22
  • 1970-01-01
  • 2018-12-25
  • 2015-05-23
  • 1970-01-01
相关资源
最近更新 更多