SAS学习——通过DATA步读取外部文本文件中的数据2

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

现在我们想要将多行属性放入一个观测中,但是不包含街道或邮箱信息(即每组信息的第二行)。该如何进行处理呢?以下列出三种方法供参考。

  • 使用多个input语句
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;

/会强制读入新行到缓冲区,并赋值给变量。上述代码中//表示强制依次读入两行,即第二行和第三行,第三行的值会覆盖第二行。

  • 使用#n行指针控制符
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中的变量。

你可能感兴趣的:(SAS数据分析)