%sysfunc CATS丢弃字符

时间:2016-12-04 13:56:56

标签: sas

考虑以下文字值' 2016年1月3日'来自数据集。这是一个格式错误的日期值,我无法使用ANYDTDTE.更正,因为我在SAS 9.0上。在这个字符串中,日期和月份也是错误的方式。这实际上是date9.格式的03JAN2016

因此,我试图使用以下宏来纠正以上所有内容:

%macro date_cats();

        proc sql noprint;
        select scan(matchdate,1,'/'), scan(matchdate,2,'/'), strip(scan(matchdate,3,'/')) into :month, :day, :year
        from test;
        quit;

        %let padder = 0;

        %if %length(&month) < 2 %then
        %let month = %sysfunc(cats(&padder., &month.));
        %put &month.;

        %if %length(&day) < 2 %then
        %let day = %sysfunc(cats(&padder., &day.));
        %put &day.;

        %put %sysfunc(cats(&day., &month., &year.));

        %mend;

        %date_cats();

三个%put语句在日志中生成以下内容:

01
03
132016

任何人都可以在最终的陈述声明中告诉我为什么最终的CATS声明要么放弃添加的&#39; 0&#39;字符或恢复到填充之前加入的宏变量?

由于

2 个答案:

答案 0 :(得分:4)

不要使用CATS()来生成宏变量。

首先它是完全不需要的,因为您可以通过将它们的值彼此相邻地扩展来连接宏变量值。取代

%let month = %sysfunc(cats(&padder., &month.));

%let month = &padder.&month.;

第二次在尝试评估CATS()等可以采用数字或字符值%SYSFUNC()的函数的参数时,会尝试评估字符串以查看它们是否为数字。在你的情况下,它们是数字,所以前导零消失。在其他情况下,您可以使SAS生成警告消息。

第三次,如果您真的想要转换字符串,例如M / D / Y&#39;变成像DMY&#39;这样的字符串。然后假设字符串包含有效日期,那么只需使用格式进行转换。

%let have=1/20/2015 ;
%let want=%sysfunc(inputn(&have,mmddyy10),ddmmyyn8);

答案 1 :(得分:0)

CATS正在查看数字并自动转换它们,无益。

通常对于宏变量,您可以使用以下

%put &day.&month.&year.;