如何在数据步

时间:2017-01-20 21:03:52

标签: sas sas-macro

我已经在这个圈子里走了1.5个小时,所以我在这里请求帮助。我想要做的就是死的简单,但我不能在我的生活中找到描述这个过程的链接。

我有以下数据步骤:

data _null_;
    some_date = "01JAN2000"D;
    call symput('macro_input_date',left(put(some_date),date9.)));
    %useful_macro(&macro_input_date);
run;

其中日期值传递给宏函数(我是这些新手)。我想使用日期值的数值 - 让我们狂野地说我希望得到年份的值,将它乘以日值,并在将月值除以3之后减去余数。我可以似乎只从输入中获得年份值。我尝试过各种各样的事情,比如

  • symget,两者都是“裸体”,前面带有“%”,其参数代表以下变体的所有可能的排列:
    • 对变量有一个裸露的引用,例如macro_input_date
    • 用单引号括起来,例如'macro_input_date'
    • 用双引号括起来,例如“macro_input_date”
    • 前缀有&符号,例如&安培; macro_input_date
  • 直接致电%sysfunc(year(<argument as variously specified above>)

有谁能告诉我我错过了什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

鉴于您询问了宏函数,我猜您的示例日期处理只是一个示例。一般来说,讨论宏函数时,重要的是要理解宏函数(通常)不会对它自己进行任何处理,它只会生成一些数据步骤代码来完成某项任务。因此,对于像您设想的示例,数据步骤代码将类似于:

%macro date_func(var=);
  year(&var) * day(&var) - mod(month(&var), 3)
%mend;

data out;
  set in; * Assume this contains a numeric called 'some_date';
  result = %date_func(var=some_date);
run;

要实现这一点,您不需要将数据值传输到宏,只需要传输变量名称:

var

请注意,此处some_date参数的值是文字文本some_date不是 data out; set in; * Assume this contains a numeric called 'some_date'; result = %date_func(var="21apr2017"d); run; 数据步变量的值。当然还有其他方法可以实现 - 你实际上可以将这个宏传递给日期文字并且它仍然可以工作:

%sysfunc

所以这完全取决于你想要做什么...也许你想将结果分配给另一个宏变量,所以它根本不需要成为数据步骤的一部分,在这种情况下你可以用{{1}}函数等做类似的事情。

答案 1 :(得分:0)

如果你只是想获得这一年,你会做类似的事情:

data _null_;
    some_date = "01JAN2000"D;
    call symput('macro_input_date',left(put(some_date,date9.)));
    yearval = substr(symget('macro_input_date'),6,4);
    put yearval=;
run;

您的宏值(&macro_input_date)不是实际日期值(14610),而是文本01JAN2000。因此,您无法使用year函数(除非您INPUT返回),您可以使用substr来获取年份部分。

当然,这是毫无意义的,因为来往/来自宏变量在这里并没有真正完成。

答案 2 :(得分:0)

你是否只是遇到日期文字问题?您的数据步骤代码

data _null_;
  some_date = "01JAN2000"D;
  call symput('macro_input_date',left(put(some_date),date9.)));
run;

只会做与

相同的事情
%let macro_input_date=01JAN2000 ;

现在,如果您想将该字符串视为表示日期,那么您需要将其包装为日期文字

"&macro_input_date"d

或转换它。

%sysfunc(inputn(&macro_input_date,date9))

为什么不将实际日期值存储到宏变量中?

call symputx('macro_input_date',some_date);

然后它看起来不像你的日期,但它看起来像是YEAR()函数的日期。