【问题标题】:SAS - If-then macros in DDESAS - DDE 中的 If-then 宏
【发布时间】:2018-01-25 20:32:38
【问题描述】:

我通过 DDE (set1, set2, set3) 将三个数据集输出到 Excel。数据集具有相同的变量,除了 set3 有两个额外的变量。我已经将 DDE 部分包装在一个宏中,我为每个数据集调用该宏,并使用“put”写出我想要的变量。如果在set3 上调用宏,我试图弄清楚如何从set3 添加两个附加变量。到目前为止,这是我的代码:

filename out dde
    'excel|sheet1!r2c2:r1000c5';

%macro write(set);
  data _null_;
    set &set.;
    file out dlm='09'x;
    put
      var1
      var2
      var3
      %if &set. = set3 %then var4 var5;
        %else ;
  run;
%mend write;
%write(set1);
%write(set2);
%write(set3);

如果我删除宏 %if-%then 语句,代码可以正常工作。任何想法如何去做?谢谢!

【问题讨论】:

  • 虽然是宏程序,但是如果-then在数据步,使用%if-%then语句是错误的。

标签: sas sas-macro


【解决方案1】:

PUT 语句没有结束分号,仅适用于 %if%else 语句。

我发现如果我独立于 SAS 代码缩进宏代码,它有助于使代码更清晰。此外,当 SAS 语句占用多行时,请确保将终端分号放在单独的行上。

您甚至可以添加一些冗余宏 %do;%end; 以帮助更清楚哪些语句是宏语句,哪些是 SAS 语句。或者在这种情况下是 SAS 语句的一部分。

%macro write(set);
  data _null_;
    set &set.;
    file out dlm='09'x;
    put var1 var2 var3
%if &set. = set3 %then %do;
        var4 var5
%end;
    ;
  run;
%mend write;

【讨论】:

  • 啊,我明白了。我以为%else 语句后面的分号会输出一个分号,从而结束%if 语句。谢谢!
  • 请记住,一旦宏处理器完成,宏代码就消失了,生成的任何文本都会传递到 SAS,就像您自己将其键入程序文件一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多