SAS读取datalines日期数据出现'Invalid data'报错咨询
问题原因
列指针整体偏移1位,所有日期字段都被截断读取,因此触发无效数据报错。
逐字符核对datalines内容可以发现:每一行数据开头都多了1个前导空格,input语句中指定@1 Date1 mmddyy10.时,实际读取的是第1-10列的内容 01/03/195(首字符为空格,末尾截断了日期最后一位的0),不属于合法的mmddyy格式日期;后续@12、@23的指针也同步偏移1位,读到的都是带前导空格的截断非法日期值。
另外format语句存在笔误:Date1、Date2后没有指定格式,仅Date3关联了mmddyy10.格式,就算数据读入成功,前两个日期也会显示为SAS内部的数值天数值,而非可读日期格式。
解决方法
两种方案任选其一即可:
方案1:删除datalines前导空格,匹配原有列指针
删掉datalines每行开头的多余空格,让第一个日期从第1列起始,同时修正format语句:
data ThreeDates; input @1 Date1 mmddyy10. @12 Date2 mmddyy10. @23 Date3 date9.; format Date1 mmddyy10. Date2 mmddyy10. Date3 mmddyy10.; datalines; 01/03/1950 01/03/1960 03Jan1970 05/15/2000 05/15/2002 15May2003 10/10/1998 11/12/2000 25Dec2005 ; run;
方案2:改用列表输入(更稳妥,不易出错)
你的数据本身是空格分隔的标准结构化数据,完全不需要手动指定列起始位置,直接按顺序写入变量和对应读入格式即可,SAS会自动跳过空格分隔符,不会因为多余前导空格、间隔空格数变化触发读取错误:
data ThreeDates; input Date1 mmddyy10. Date2 mmddyy10. Date3 date9.; format Date1 Date2 Date3 mmddyy10.; datalines; 01/03/1950 01/03/1960 03Jan1970 05/15/2000 05/15/2002 15May2003 10/10/1998 11/12/2000 25Dec2005 ; run;
两种方案运行后均可正常读入3条记录的全部日期值,不会再出现Invalid data报错。
内容的提问来源于stack exchange,提问作者bandcar
相关产品推荐
相关产品推荐

