SAS数组字符日期并在输入函数后重命名变量

时间:2018-03-14 15:00:06

标签: arrays sas

尝试确定清理日期(字符)的合理方法,然后通过input函数将这些日期放在正确的日期格式中,但是一旦保存了合理的变量名称(甚至可能保留原始变量名称)执行char-to-number进程。

正在使用数组清理日期(将'..'替换为'01',或将'....'替换为0101),因为大约有75个变量将日期作为字符串。

实施例。 -

data sample;
input d1 $ d2 $ d3 $ d4 $ d5 $;
cards;
200103.. 20070905 20060222 2007.... 199801..
;
run;

data clean;
set sample;
array dt_cln(5) d1-d5;
array fl_dt (5) f1-f5;
*clean out '..'/'....', replace with '01'/'0101';
do i=1 to 5;
    if substr(dt_cln(i),5,4) = '....' then do;
        dt_cln(i) = substr(dt_cln(i),1,4) || '0101';
    end;
    else if substr(dt_cln(i),7,2) = '..' then do;
        dt_cln(i) = substr(dt_cln(i),1,6) || '01';
    end;
end;
*change to number;
do i=1 to 5;
    fl_dt(i)=input(dt_cln(i),yymmdd8.);
end;
format f: date9.;
drop i d:;
run;

最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

您不能保留原始名称并直接从字符转换为数字 - 但是,使用一些宏代码,您可以删除所有旧字符变量并重命名您创建的数字版本。 E.g。

%macro rename_loop();
    %local i;
    %do i = 1 %to 5;
        f&i = d&i
    %end;
%mend;

然后在您的数据步骤中,在drop语句后面添加一个重命名语句:

rename %rename_loop;

否则,您现有的方法已经相当不错了。您可以稍微简化清洁过程,例如删除第一个do-loop并在第二个中执行以下操作:

fl_dt(i)=input(tranwrd(dt_cln(i),'..','01'),yymmdd8.);

答案 1 :(得分:0)

data want;
   set sample;
   array var1 newd1-newd5;
   array var2  d:;
   do over var2;
      var1=input(ifc(index(var2,'.')^=0,put(prxchange('s/((\.){1,})/0101/',-1,var2),8.),var2),yymmdd8.);
   end;
   format newd1-newd5 yymmddn8.;
   drop d:;
run;