加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

infile语句中truncover选项的用法

(2014-01-04 12:21:21)
标签:

sas

infile

input

truncover

数据导入

it

分类: SAS数据导入

在和大家分享infile语句中truncover选项的用法之前,先用以前和大家分享的方法读入一个文件。

需求如下:

在D:\下存放了名为myfile.txt的文本文件,文本文件的内容如下:

1

22

333

4444

55555

需要将这个文件的内容导入到SAS数据集中,数据集的名称为work.mydata,该数据集只包含一个字段num,该字段的长度是5。

用如下代码完成需求:

data work.mydata;

    infile "D:\myfile.txt";

    input @1 num 5.;

run;

按F3,待程序运行完毕后检查日志,发现没有错误,我们将数据集的内容用如下代码打印出来:

proc print data = work.mydata;

run;

结果:

                                         Obs      num

                                                22
                                                  4444
                                                 55555
通过打印出的结果看到,数据并没有正确导入,只导入了第二条,第四条和第五条。

下面分析产生这种结果的原因,首先看日志,日志当中有这样两条信息:

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;

    infile "D:\myfile.txt" truncover;

    input @1 num 5.;

run;

结果为:

                                         Obs      num

                                                 1
                                                    22
                                                   333
                                                  4444
                                                 55555

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有