Hey @ballardw,
I'm sorry, I should have been more specific. The three date formats that I posted are the only three that are present:
YYYYMMDD
YYYYMM YYMMDD
The problem that you mention, about descerning between 160115 is precisely how I ran into this problem. I will include my current logic below:
%let inMonthIndex = %eval(&InYearIndex. + 4); %let inDayIndex = %eval(&InYearIndex. + 6);
data file_list; set file_list; format QueryDate DATE9.; informat QueryDate DATE9.; format DataDate DATE9.; informat DataDate DATE9.; QueryDate = Date+&InQueryDateLag.; MonthNum = substr(filename,&InMonthIndex.,2)*1; DayNum = substr(filename,&InDayIndex.,2)*1; /*HOKEY WAY TO DEAL WITH FILES THAT DON'T HAVE A MONTH AND DAY in FILENAME*/ if MonthNum < 1 or MonthNum > 12 then Month = "01"; else Month = substr(filename,&InMonthIndex.,2) ; if DayNum < 1 or DayNum > 31 then Day = "01"; else Day = substr(filename,&InDayIndex.,2);
DataDate = mdy(Month,Day,substr(filename,&InYearIndex.,4)); is6digit = 0; if DataDate = . or year(datadate) < 1915 then do; DataDate = mdy( substr(filename,&InMonthIndex.-2,2),substr(filename,&InDayIndex.-2,2),substr(filename,&InYearIndex.,2) ); is6digit = 1; end; drop DayNum MonthNum Day month; run;
Obviously I define &YearIndex earlier, (this takes care of filenames that begin with a prefix, like JM20160112, at which point the index would be 3) This is an input into the macro.
You can see that my logic where I infer that the date is YYMMDD when the date is less than 1915, which is how I get rid of thinking that the date is 1601. However, this will break when the clock strikes the year 2020.
Let me know if I can provide more information.
... View more