Compress函数:
Compress函数的功能其实有几个,它可以有1-3个参数。分别介绍如下(你的问题 Height = compress(Height,'INFT.','i'); 在“三个参数”得到回答):
一, 1个参数,表示(只)去掉所有空格,包括前面,后面,中间。与其它字符无关。
x=' Mary got married on 11-11-2011 '; /*注意,句子前后都有一个空格,红色*/
y1=compress(x);
结果:Marygotmarriedon11-11-2011 (前,后面,中间的空格都被去掉)
二,2个参数:去掉引号内列出的任何东西,可以是字符,数值,空格。大小写敏感。
x='Mary got married on Jan. 11, 2000';
y2=compress(x, 'm10' );
结果:y2=Mary got arried on Jan. , 2 /* m, 1, 0 被去掉 */
三,3个参数:
第三个参数通常就两种:
一是用 ‘ i ’,表示第二个参数括号内字母大小写不敏感(这一点和FIND语句的‘ i ’类似);
二是用 ‘ k ’,表示第二个参数括号内提到的所有东东保留(keep),未提到的则统统去掉(仍是大小写敏感)
(FIND语句也有类似的‘ k ’功能)。
x='Mary got married on Jan. 11, 2000'; y3_i = compress(x, 'm10' , 'i' );
y3_k = compress(x, 'm10' , 'k' );
结果:
y3_i=ary got arried on Jan. , 2
y3_k=m11000
四,仍是3个参数:既要大小写不敏感,又要使用 k 的功能,用 ‘ik’。
x='Mary got married on Jan. 11, 2000'; y4 = compress(x, 'm10' , 'ik' );
结果:y4=Mm11000
Scan函数:
Scan函数理论上也是3个参数,其一般通式为 scan(string, N, delimiters),即 “由第三个参数(delimiters分隔符)将字符串分为多个部分,第N个部分即为所求。
要注意的是Scan函数的缺省分隔符很多,包括: 空格 . < ( + | & ! $ * ) ; ^ - / , % 等全是。你所提到的“空引号”就是要求以空格作为分隔符。注意的是,第三个参数不是必需的,如果缺失,表示系统将使用缺省分隔符。
举例:以斜线做分隔符:
data _test_;
date='4/8/2016';
Day=scan(date, 2, '/' );
put Day=;
结果:Day=8
还有一点要注意的是,Scan函数的目标变量的长度。从SAS 9.4开始,已不再规定是200了,而是规定由Scan函数的第一个参数的长度决定的,如上例, date长度是8,所以Day 的长度也是 8。有人参加SAS base考试就碰到过类似的问题,按原来老版本SAS的标准答案答题,结果被判错误。题目见下:
The following SAS program is submitted:
data work.test;
Author = 'Agatha Christie';
First = substr(scan(author, 1, ' ,'), 1, 1);
run;
Which one of the following is the length of the variable FIRST in the output data set?
A. 1
B. 6
C. 15
D. 200
答案:以前是D。新答案是 C,因为 Scan函数的第一个参数Author的长度是15。