用于检查缺失日期的sas宏代码

用于检查缺失日期的sas宏代码,sas,sas-macro,Sas,Sas Macro,如果输入日期如下所示,则输出日期应如下所示 我希望sas宏代码检查输入中缺少的日期 1.-MMM-YYYY = 01-MMM-YYYY --YYYY = 01-JAN-YYYY DD--YYYY = DD-JAN-YYYY DD-MMM- = DD-MMM-0000 皮尤斯, 如果您在问题中列出的列表是完整的,那么下面的代码段是获得所需结果的简单方法。我用宏和非宏if-then语句来处理它 data inputss; input

如果输入日期如下所示,则输出日期应如下所示

我希望sas宏代码检查输入中缺少的日期

    1.-MMM-YYYY = 01-MMM-YYYY
    --YYYY    = 01-JAN-YYYY 
    DD--YYYY  = DD-JAN-YYYY 
    DD-MMM-   = DD-MMM-0000
皮尤斯, 如果您在问题中列出的列表是完整的,那么下面的代码段是获得所需结果的简单方法。我用宏和非宏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 $20.; 
   datalines4;
  -JAN-1975 
  --1977 
  02--1978 
  03-JAN- 
  01-JAN-1980
  03--
  -JAN-
;;;;
run;

data haha2(Keep = birthdate new_bdate);
  set have;  
   format day $2. month $3. Year $4. New_bdate $11.;
   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;

我怎样才能对这个问题进行逻辑分析?需要一些帮助…上述输入缺少日期、月份,我是否可以先读取str,然后查看缺少的日期,然后显示相应的输出当您确定日期不完整时,根据业务规则扫描每个部分并填写缺少的位并重新组合。Peeyus,你过去问过问题,但没有确认你是否得到了答案。除了提问之外,请花时间识别提供的答案,以便大家继续回答您的问题。但我的输入数据集具有以下值-->数据具有;输入生日$;卡片-1975年1月-1977年2月-1978年3月;我的输入如上所述,有4个obs,特别是obs缺少日期、月份和年份,而在obs 2中缺少日期和月份,3个obs缺少月份。那么我们如何使用if-else条件来显示日期输出。只需将数据放入宏%macro checkmiss;%如果in='-Jan-1975'%,则日期输出='01-Jan-1975';%else%如果in='--1977'%,则日期输出='01-JAN-1977';%else%如果in=02--1978%,则输出日期为'02-JAN-1978';%else%如果in=03 Jan-%,则输出日期为'03-Jan-0000';运行;%修补支票未命中;%无支票;