【问题标题】:How do you assign the result of a macro function to a macro variable in SAS?如何将宏函数的结果分配给 SAS 中的宏变量?
【发布时间】:2010-10-29 08:19:08
【问题描述】:

我有一个创建时间戳的宏(附加到输出文件名)。但是,与其记住宏将值分配给哪个宏变量,我更愿意将宏变量分配给宏的结果(如果这还不够循环的话)。

%let tms= %tms();

这是当前的宏......

%macro tms ;
    %* Create a Timestamp ;
 %let tms_date= %sysfunc(date(),yymmdd10.) ;  %* Todays date ;
 %let tms_time= %sysfunc(time(),time.) ;      %* Current Time ;

    %* Format mmddyyhhmmss ;
 %let tms=_%scan(&tms_date,1)%scan(&tms_date,2)%scan(&tms_date,3)%scan(&tms_time,1,:)%scan(&tms_time,2,:)%scan(&tms_time,3,:) ;

%mend ;

您如何引用它以使其发挥作用? 另外,我会从宏中删除“%let tms=”吗?

另外,下面的 ODS 赋值语句是否可以使用相同的引用?

ods Tagsets.excelxp file="&outname.&tms..xml" style= Styles.XLsansPrinter ;

感谢您抽出宝贵时间......

【问题讨论】:

    标签: sas sas-macro


    【解决方案1】:

    具有返回值的宏通常称为宏函数。在 mend 语句之前,如果您放置一个不带分号的表达式/值,它将将该值返回给调用者。如果返回值在 if-else 块中,则 ;将是必要的。

    基本上,您可以按照您的建议进行操作,并从宏内部删除 %let tms=。是的,我相信它可以与 ods 分配声明一起使用。

    %macro tms ;
        %* Create a Timestamp ;
     %let tms_date= %sysfunc(date(),yymmdd10.) ;  %* Todays date ;
     %let tms_time= %sysfunc(time(),time.) ;      %* Current Time ;
    
            %* Format mmddyyhhmmss ;
     _%scan(&tms_date,1)%scan(&tms_date,2)%scan(&tms_date,3)%scan(&tms_time,1,:)%scan(&tms_time,2,:)%scan(&tms_time,3,:) 
    %mend;
    %let tms=%tms;
    %put **&tms**;
    

    作为另一个建议,您可以通过使用 compress 函数而不是像这样的 %scan 函数来简化代码

    %sysfunc(compress(_&tms_date.&tms_time,"-:"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 2016-02-01
      相关资源
      最近更新 更多