SAS中的informat和input

在data步中,在读取原始数据文件时,需要输入input语句,同时经常会遇到informat或者length语句,这个时候很多童鞋都容易被他们的功能搞混,input语句可以设定输入变量的输入长度,informat也可以,这个时候就郁闷了,到底咋整啊。

我们知道变量分为两种:数值型和字符型,对于数值型,我们不区分input和informat、length的长度设置功能,因为三者者基本保持一致,因此接下来只限于对字符型变量的输入进行阐述。

首先说一下input和informat。

其实,这几个语句都是为了规范变量的输入长度,我们知道在变量读取原始数据时会为其建立一个缓冲区用于数据的读取,input对于字符型变量在默认的长度情况下和informat功能保持一致,两者都是在默认间隔符为空格的前提下进行数据的读取。但是,当input对变量长度设定不再是默认的情况下,二者就有区别了。

Input语句用于设定变量的输入格式,在数据输入的缓冲区里按照input设定的长度进行满格读取,并且无间隔划分;而informat语句则在设定变量输入格式的前提下,在缓冲区读取数据时先为你划分好间隔,这么做有什么意义呢?首先它不一定满格读取,缓冲区数据字符串本身有一个长度,如果这个长度大于或者等于设定的变量长度,那么读取按照变量长度来读取,如果长度小于变量长度,则按照设定长度来读取,总之取二者之间的最小值。说了这么多,还是上代码吧:

第一种情况:当缓冲区字符串长度小于变量informat设定的长度时:

data _nul;

informat var1 $4.;

input var1 $ var2 $;

put var1 = ;

cards;

abcde fgh

;

run;

最终结果可以得到 var1 = abcd。

从上述代码,我们可以看到数据读取以空格为间隔符,var1对应的读取字符串为abcde,长度为5,大于变量设定的长度4,因此读取出来的就是abcd。

第二种情况:当缓冲区字符串长度大于变量informat设定的长度时:

data _nul;

informat var1 $7.;

input var1 $ var2 $;

put var1 = ;

cards;

abcde fgh

;

run;

最终结果可以得到 var1 = abcde。

上述代码可以看到数据区var1对应的字符串为abcde,长度为5,而变量设定的长度为7,但是读取出来的字符串依旧为abcde。

所以从这两个例子可以明显看出,informat是通过间隔符为每一个变量划分出来一个区域,abcde和fgh被划分成为两个区域,在对应区域你可以设定对应变量的长度来进行变量的读取。

如果不用informat的话,结果会发生什么变化呢?

展示一下代码如下所示:

data _nul;

input var1 $7. var2 $;

put var1 = ;

cards;

abcde fgh

;

run;

最终结果为var1 = abcde f。

从这个代码就可以看到input和informat的区别了,input并未进行划分abcde和fgh成两个区域,而是直接按照变量设定的长度来进行读取。

避免这种情况的第一种办法是对input语句的变量采用默认长度8,例如:input var1 $;

当采用默认长度(前面被排除的这个情况)时,变量就会按照间隔符读取,但是这种方法有个弊端,如果变量长度超过默认的长度8,那么就会出现字符串被截断的情况,例如abcdefghi中的i最终被截断。

第二种办法是结合informat,对于变量出现字符串长短不一的情况,我们可以对informat设定长度尽量大一点,只要超过对应字符串的各行中长度最大的那一个值就行,例如:

data null;

informat var1 $5.;

input var1 $ var2 $;

put var1 = var2 =;

cards;

abcde fgh

ab fgh

;

run;

最终结果得到:

var1=abcde var2=fgh

var1=ab var2=fgh

上述代码通过informat设定最大的值5,这样就可以同时获取abcde和ab值了。

那么对于length语句也可以实现和informat一样的功能,大家有兴趣的可以将informat替换成length试试,当然记得将informat语句的小数点去掉,length语句是不需要小数点的。

说了这么多,举一个读取外部数据的例子吧:

如下为一个txt文件:
在这里插入图片描述
接下来我要读取这个txt文件,文件有三行三列,以逗号作为间隔符,可以看到文件并不是很规范的排列,所以可以用informat和input结合:

data tmp;

infile “C:\users\联想\desktop\test.txt” dlm = ‘,’;

informat var1 $20. var2 $20. var3 $20.;

input var1 $ var2 $ var3 $;

cards;

run;

得到如下结果:
在这里插入图片描述
可以看到,与上述txt文件相对应。

希望能够对各位在informat和input的理解上有一定的帮助。

【本文转载自新闻网站http://www.dedns.cn/xinwen/2314482_2.shtml,侵删】

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值