1、SAS在为所有变量读到数据之前就遇到了输入行的末尾的情况进行处理。
使用INFILE语句的选项,指定missover、truncover或stopover选项,从而改变sas默认行为。
默认情况下选项为flowover,input语句会读入下一条记录到输入缓冲区中,给当前PDV中未赋值的变量赋值。
missover:当原始数据记录中的最后一个或多个字段没有值,并且希望SAS将对应的变量置为缺失值。
truncover:当输入缓冲区的数据长度少于当前变量要求的长度时,则将当前输入缓冲区中的数据赋值给PDV中的该变量。所有未赋值的变量置为缺失值。
stopover:当input语句在当前输入行找不到所有数据值时,sas会停止执行该data步。
2、在创建SAS数据集的观测前先测试条件是否成立。
在只需要读入部分满足条件的数据时,可能需要先读入部分变量值,判断这些变量值是否满足条件。
数据文件sales.dat内容如下,其中包括员工ID、部门、销售额和上次修改时间,现在只需要读取部门TSG的员工并创建数据集。
ET001 TSG $10000 01JAN2012
ET002 $12000 01FEB2012
ET003 TSG $25000 02MAR2012
ET004 CSG $16000 07SEP2012
示例代码:
data saslib.sales;
infile extfiles(sales);
input Dept $7-9 @;
if Dept='TSG';
input Emp_ID $1-5 +5 Sales comma6. @20 Date date9.;
run;
proc print data=saslib.sales noobs;
run;
用@行保持符可以将输入缓冲区的数据保持住,当前迭代的下一条input语句可以继续使用。当开始下一次data步迭代时,输入缓冲区的数据会被释放。
3、读单条记录创建多个观测。
数据文件inventory2.dat内容如下,每行有两种商品的信息。
P001R 12 125.00 P003T 34 40.00
P301R 23 500.00 PC02T 12 100.00
用@@行保持符将记录一直保存在输入缓冲区,直到输入缓冲区中的所有数据值都被读取。
示例代码:
data saslib.inventory;
infile extfiles(inventory2);
input Product_ID $ Instock Price @@;
run;
proc print data=saslib.inventory noobs;
run;
4、从多条记录中创建一个观测。
数据文件customer3.txt内容如下,一个联系人的属性信息有四行。如下所示:
Greg William
14 Bridge St.
San Francisco
CA
Emily Cooker
42 Rue Marston
New york
NY
Jimmy Cruze
Box 100
Cary
NC
现在我们想要将多行属性放入一个观测中,但是不包含街道或邮箱信息(即每组信息的第二行)。该如何进行处理呢?以下列出三种方法供参考。
data saslib.customer;
infile extfiles(customer3) truncover;
input Name $20.;
input;
input City $20.;
input State $2.;
run;
proc print data = saslib.customer noobs;
run;
data saslib.customer;
infile extfiles(customer3) truncover;
input Name $20./ / City $20./State $2.;
run;
proc print data = saslib.customer noobs;
run;
/会强制读入新行到缓冲区,并赋值给变量。上述代码中//表示强制依次读入两行,即第二行和第三行,第三行的值会覆盖第二行。
data saslib.customer;
infile extfiles(customer3) truncover;
input #1 Name $20. #3 City $20. #4 State $2.;
run;
proc print data = saslib.customer noobs;
run;
此时n的最大值为4(所出现的最大的数),也可以在input 语句后加#n 自定义n的大小;
data步在编译时会自动创建一个4行的输入缓冲区。input语句一次性将4条记录读入到输入缓冲区中,然后根据#n取输入缓冲区的数据赋值给PDV中的变量。