SAS导入CSV数值错误:27被识别为0.27的问题排查
问题原因分析与解决办法
错误原因
你使用的commax10.2输入格式(informat)里,.2是强制指定输入数值的小数位数为2位。当读取到没有逗号(作为小数点分隔符)的纯整数(比如示例里的"27")时,SAS会把这个数值当成两位小数处理——自动将"27"除以100,得到0.27,这就导致数值被错误缩小。
解决办法
方法1:修改输入格式(推荐)
把commax10.2改成commax10.(去掉固定的小数位数指定),让SAS根据输入数据的实际格式自动识别小数位数。这样纯整数"27"会被解析为27,带逗号的"26,46"会被解析为26.46,完全符合预期。
修改后的代码示例:
data work.mydataset; length filename $100; set work.files; location=cat("&path",filename); infile dummy filevar=location length=reclen end=done missover dlm=';'; do while (not done); informat d1 ddmmyy10. p1 commax10. p2 commax10. p3 commax10. p4 commax10. p5 commax16.; format d1 date9. p1 commax10.2 p2 commax10.2 p3 commax10.2 p4 commax10.2 p5 commax16.; input d1 p1 p2 p3 p4 p5; output; end; run;
方法2:统一保留两位小数(可选)
如果需要确保最终数值统一保留两位小数,可以在读取后用round函数处理,比如在input语句后添加:
p1 = round(p1, 0.01); p2 = round(p2, 0.01); /* 其他数值字段同理 */
这一步不影响读取逻辑,只是对读取后的数值做精度统一。
内容的提问来源于stack exchange,提问作者Tiago Vasconcelos
相关产品推荐
相关产品推荐

