用于检查缺失日期的 sas 宏代码
sas macro code to check missing dates
如果下面给出了输入日期,那么输出的日期应该是给定的
我希望 sas 宏代码检查输入中缺少的日期
1.-MMM-YYYY = 01-MMM-YYYY
--YYYY = 01-JAN-YYYY
DD--YYYY = DD-JAN-YYYY
DD-MMM- = DD-MMM-0000
Peeyush,
如果您放入问题中的列表是完整的,下面的代码段是获得所需结果的简单方法。我把宏和非宏 if-then 语句都放在一起处理。
data inputss;
input in $ ;
cards;
-MMM-YYYY
--YYYY
DD--YYYY
DD-MMM-
;
data result;
set inputs;
if in = '-MMM-YYY' then Date_Output = '01-MMM-YYYY';
else if in = '--YYYY' then Date_Output = '01-JAN-YYYY' ;
else if in = 'DD--YYYY' then Date_Output = 'DD-JAN-YYYY' ;
else if in = 'DD-MMM-' then Date_Output = 'DD-MMM-0000';
run;
%macro checkmiss;
%if in = '-MMM-YYY' %THEN Date_Output = '01-MMM-YYYY';
%else %if in = '--YYYY' %THEN Date_Output = '01-JAN-YYYY' ;
%else %if in = 'DD--YYYY' %THEN Date_Output = 'DD-JAN-YYYY' ;
%else %if in = 'DD-MMM-' %THEN Date_Output = 'DD-MMM-0000';
run;
%mend checkmiss;
%checkmiss;
我创建了一个数据集,其中包含所有可能缺少日、月和年的情况。下面的数据步骤解决了所有可能性以及如何处理它们以按照您请求的格式创建结果变量 new_bdate。
data have;
input birthdate .;
datalines4;
-JAN-1975
--1977
02--1978
03-JAN-
01-JAN-1980
03--
-JAN-
;;;;
run;
data haha2(Keep = birthdate new_bdate);
set have;
format day . month . Year . New_bdate .;
call scan(birthdate, 1, First_Pos, First_Length);
First_Word = substrn(birthdate, First_Pos, First_Length);
call scan(birthdate, -1, Last_Pos, Last_Length);
Last_Word = substrn(birthdate, Last_Pos, Last_Length);
if length(birthdate) = 11 then length1 = 'Y';
else length1 = 'N';
if length1 = 'Y' then do;
Day = substr(birthdate,1,2);
Month = substr(birthdate,4,3);
Year = substr(birthdate,8,4);
end;
else if length1 = 'N' then do;
if (First_Pos = '1' and Last_Length = '2') then do
Day = First_Word;
Month = 'JAN';
Year = '0000';
end;
else if (First_Pos = '1' and Last_Length = '3') then do
Day = First_Word;
Month = Last_Word;
Year = '0000';
end;
else if (First_Pos = '1' and Last_Length = '4') then do
Day = First_Word;
Month = 'JAN';
Year = Last_Word;
end;
if (First_Pos = '2' and Last_Length = '3') then do
Day = '01';
Month = First_Word;
Year = '0000';
end;
else if (First_Pos = '2' and Last_Length = '4') then do
Day = '01';
Month = First_Word;
Year = Last_Word;
end;
else if (First_Pos = '3' and Last_Length = '4') then do
Day = '01';
Month = 'JAN';
Year = Last_Word;
end;
end;
New_bdate = Day||'-'||Month||'-'||Year;
run;
如果下面给出了输入日期,那么输出的日期应该是给定的
我希望 sas 宏代码检查输入中缺少的日期
1.-MMM-YYYY = 01-MMM-YYYY
--YYYY = 01-JAN-YYYY
DD--YYYY = DD-JAN-YYYY
DD-MMM- = DD-MMM-0000
Peeyush, 如果您放入问题中的列表是完整的,下面的代码段是获得所需结果的简单方法。我把宏和非宏 if-then 语句都放在一起处理。
data inputss;
input in $ ;
cards;
-MMM-YYYY
--YYYY
DD--YYYY
DD-MMM-
;
data result;
set inputs;
if in = '-MMM-YYY' then Date_Output = '01-MMM-YYYY';
else if in = '--YYYY' then Date_Output = '01-JAN-YYYY' ;
else if in = 'DD--YYYY' then Date_Output = 'DD-JAN-YYYY' ;
else if in = 'DD-MMM-' then Date_Output = 'DD-MMM-0000';
run;
%macro checkmiss;
%if in = '-MMM-YYY' %THEN Date_Output = '01-MMM-YYYY';
%else %if in = '--YYYY' %THEN Date_Output = '01-JAN-YYYY' ;
%else %if in = 'DD--YYYY' %THEN Date_Output = 'DD-JAN-YYYY' ;
%else %if in = 'DD-MMM-' %THEN Date_Output = 'DD-MMM-0000';
run;
%mend checkmiss;
%checkmiss;
我创建了一个数据集,其中包含所有可能缺少日、月和年的情况。下面的数据步骤解决了所有可能性以及如何处理它们以按照您请求的格式创建结果变量 new_bdate。
data have;
input birthdate .;
datalines4;
-JAN-1975
--1977
02--1978
03-JAN-
01-JAN-1980
03--
-JAN-
;;;;
run;
data haha2(Keep = birthdate new_bdate);
set have;
format day . month . Year . New_bdate .;
call scan(birthdate, 1, First_Pos, First_Length);
First_Word = substrn(birthdate, First_Pos, First_Length);
call scan(birthdate, -1, Last_Pos, Last_Length);
Last_Word = substrn(birthdate, Last_Pos, Last_Length);
if length(birthdate) = 11 then length1 = 'Y';
else length1 = 'N';
if length1 = 'Y' then do;
Day = substr(birthdate,1,2);
Month = substr(birthdate,4,3);
Year = substr(birthdate,8,4);
end;
else if length1 = 'N' then do;
if (First_Pos = '1' and Last_Length = '2') then do
Day = First_Word;
Month = 'JAN';
Year = '0000';
end;
else if (First_Pos = '1' and Last_Length = '3') then do
Day = First_Word;
Month = Last_Word;
Year = '0000';
end;
else if (First_Pos = '1' and Last_Length = '4') then do
Day = First_Word;
Month = 'JAN';
Year = Last_Word;
end;
if (First_Pos = '2' and Last_Length = '3') then do
Day = '01';
Month = First_Word;
Year = '0000';
end;
else if (First_Pos = '2' and Last_Length = '4') then do
Day = '01';
Month = First_Word;
Year = Last_Word;
end;
else if (First_Pos = '3' and Last_Length = '4') then do
Day = '01';
Month = 'JAN';
Year = Last_Word;
end;
end;
New_bdate = Day||'-'||Month||'-'||Year;
run;