2017-10-18 20 views
2

我试图从记事本(文本)阅读下面的数据文件转换为SAS数据集:数据不正确地读他为失踪人在使用DSD选项INFILE语句(SAS)

name1,124325,08/10/2003,1250.03 
name2,114565,08/11/2003,11115.11 
name3,000007,08/11/2003,12500.02 

当我使用该SAS代码:

data new; 
filename tfile '~\transact2.txt'; 
infile tfile dsd; 
input name $ id date mmddyy10. cost 8.2; 
run; 

我得到这个,成本是所有丢失:

enter image description here

但是,如果我只是用dlm=','替换dsd,则会正确读入成本变量。为什么dsd会导致成本变量读取不正确?

回答

2

dsd不说“使用分隔符”。它告诉SAS 如何使用该分隔符(主要是将引号中的任何内容视为一个字段,并修改连续分隔符的处理方式)。有必要正确读取这个文件,需要使用dlm=','。我感到有点惊讶,你已经像你一样接近正确了。 (幸运的是,SAS在这里做了一些假设,最终使其工作正常,或多或少)。

此外,你混合两种风格的输入,这是不允许的。

当您使用分隔输入时,您正在使用列表而非列输入。您只能指示字符/不是字符,并且不能直接使用信息。如果你想要像你的日期做嵌入informats,你需要使用修改后的列输入:

data new; 
filename tfile '~\transact2.txt'; 
infile tfile dsd; 
input name $ id date :mmddyy10. cost; 
run; 

还要注意cost,阅读与8.2不正确。信息中的小数仅用于在12345678中作为123456.78(当您有80个列卡并且不希望在小数点上花1)时读取。一般来说,在“现代”SAS中,你不应该使用信息的小数部分。 SAS会看到小数点,并正确处理。

+0

谢谢,解决了这个问题!我不知道 - 如果mmddyy10。适用于“日期”的格式是问题,那么为什么SAS将“成本”设置为丢失而不是“日期”?它看起来像“日期”在输出中确实应用了正确的格式。 – LLP

+1

使用格式化输入'date mmddyy10.'而不是列表输入'date:mmddyy10.'时,SAS将精确移动10个字符,并且可以尝试将分隔符读入数据或将光标保留在分隔符之前,以便它看起来你有两个相邻的分隔符,因此缺少一个值。 – Tom