infile语句中truncover选项的用法
(2014-01-04 12:21:21)
标签:
sasinfileinputtruncover数据导入it |
分类: SAS数据导入 |
在和大家分享infile语句中truncover选项的用法之前,先用以前和大家分享的方法读入一个文件。
需求如下:
在D:\下存放了名为myfile.txt的文本文件,文本文件的内容如下:
1
22
333
4444
55555
需要将这个文件的内容导入到SAS数据集中,数据集的名称为work.mydata,该数据集只包含一个字段num,该字段的长度是5。
用如下代码完成需求:
data work.mydata;
run;
按F3,待程序运行完毕后检查日志,发现没有错误,我们将数据集的内容用如下代码打印出来:
proc print data = work.mydata;
run;
结果:
通过打印出的结果看到,数据并没有正确导入,只导入了第二条,第四条和第五条。
下面分析产生这种结果的原因,首先看日志,日志当中有这样两条信息:
NOTE: 5 records were read from the infile "D:\myfile.txt".
The minimum record length was 1.
The maximum record length was 5.
意思是说,从文本文件中读入了五条数据,最长的纪录长度为5,最短的记录长度为1。没问题啊,是有读入了五条数据,那为什么数据集中只有三条数据呢。问题就在于记录长度上,上面的日志已经提示,最长的纪录长度为5,最短的记录长度为1,其实准确来说,文本文件的第一条长度为1,第二条长度为2,依此类推,最后一条长度为5。我们用input语句读取字段的长度为5,但是第一条记录的长度不够5啊,那怎么办呢,input语句是这样处理的:
如果一条记录的长度不够input语句读取的长度,input语句会跳到下一行,并且读取下一行的数据。
于是出现了上面的结果,第一行长度小于5,读取下一行22,然后开始读取第三行,第三行长度小于5,读取下一行,然后开始读取第五行,第五行长度等于5,成功读取这条记录。
解决方案:
我们要是非要读取这样的数据,难道就没有办法了吗,办法是有的,需要在infile语句后面加上truncover选项,来阻止input语句跳转到下一行。
代码如下:
data work.mydata;
run;
结果为: