上面一节讲了SAS的基本概念,以及语法结构,这次主要讲解SAS DATA步读取数据。

   1 ·列表输入

   2 ·按列输入

   3 ·格式化输入 

使用DATA步读取数据的基本形式如下:

DATA  数据集;

INPUT  变量1  <$>   <变量2  <$>   …>;

datalines;

RUN;

·数据集指定要生成的数据集。

·文件引用指定要读入外部原始数据文件。

·变量1、变量2等是数据集的变量,变量与变量之间用空格分隔。 对于字符变量则需在变量后加字符$。

1、 按列表输入数据:需要制定分隔符

(1)   按列表输入:按列表输入需要指定分隔符,默认的分隔符是空格,连续的分隔符会认为是同一个分隔符处理,格式同上面的一样。

原始数据各个字段以空格隔开当原始数据记录中的数据值以一个或多个空格隔开,且数据值中不包含空格时,可使用默认的列表输入方式。

P001R    12    125.00
P003T    34    40.00
P301M    23    500.00
PC02M    12    100.00

在data窗口里面输入下面的按钮

data  Inventory;
input  Product_ID  $  Instock  Price;
datalines;
P001R       12   125.00
P003T    34    40.00
P301M    23    500.00
PC02M    12    100.00
;
run;
proc  print  data=Inventory;
run;

·使用列表输入时,字符变量长度默认为8个字节。当输入数据长度 超过8个字节时,从输入缓冲区读入PDV的数据值会产生截断。这个问 题可以通过在INPUT语句之前使用LENGTH语句指定该变量的长度或其 他方式来解决。

·SAS遇到空格时会停止读入当前数据值,这样SAS就不能处理原始 数据记录中的数据值包含空格的情况了。

·原始数据中必须使用占位符(.)来表示该数据值为缺失值。

(2)使用LENGTH语句指定字符变量长度 指定变量长度的LENGTH语句的基本形式如下:  

LENGTH     变量1     <$>长度    <变量2     <$>长度    …>;

通常在变量第一次出现时程序会根据上下文环境确定其长度。可以 在INPUT语句前通过LENGTH语句明确指定变量长度。如下面的数据,可以采用,部分长度大于8个字符

WA Washington 
CA California 
AK  Alaska
AL  Alabama

应该使用下面的语句,来进行调用。

data  saslib.state;
length  State  $20;
input  Short_Name  $  State  $;
datalines;
WA Washington 
CA California 
AK  Alaska
AL  Alabama
;
run;
proc  print  data=saslib.state  noobs;
run;

2、按列输入

当原始数据记录中的数据值在每条记录中占据相同的列时,可使用按列输入的方式。按列输入(Column Input)可以读取固定列的数据,如下面的数据。

C001 Bridge  St.     14  San Francisco  CA
C002 Emily Cooker    42  Rue Marston    
C002                 52  Rue Marston    Paris
C005 Jimmy Cruze Box 100 Cary    NC

该读入方式的INPUT语句基本形式如下:

INPUT 变量1 <$>  开始列<-结束列>  <变量2 <$>开始列<-结束列>  …>;
其中:
·变量名后有$表示该变量为字符型变量。
·开始列-结束列指定变量在原始数据记录中所处的位置。
·变量长度由为该变量指定的列数确定,可以超过8个字节。
·按列输入可读入包含空格的数据值。
·可以处理数据中的缺失值,不需要使用占位符。

在data窗口里面输入下面的代码

data  saslib.customer;
input  Customer_ID  $  1-4 Name  $  6-19  Address  $  21-37  City  $  39-51 State  $  53-54
;
datalines;
C001 Bridge  St.     14  San  Francisco  CA
C002 Emily Cooker    42  Rue  Marston    
C002                 52  Rue  Marston    Paris
C005 Jimmy Cruze Box 100 Cary    NC
;
run;
proc  print  data=saslib.customer  noobs;
run;

 

3、 格式化输入

二进制数据、日期/时间(01FEB2013),或者包含逗号(1,262)、货币符号($87.3)等特殊字符的数字值。在这种情况下,就需要使用格式化 输入(formatted input)了,即在INPUT语句中提供特殊的指令,以便 SAS正确地读取原始数据记录中的数据值。这些特殊指令称为输入格式(Informat)。格式化输入组合了按列输入特征和读取非标准化数字或 字符值的能力,保证数据值可正确地从原始数据记录中读入。     

INPUT  变量  <$>   输入格式;

 SAS提供的输入格式有:数值型(数值与日期时间型)。同时还支持自定义格式。

data  user.sales;
input  Emp_ID  $1-5  Dept  $7-9  +1  Sales  comma6.  @18  Date  date9.;
datalines;
ET001 TSG $10000 01JAN2012
ED002      $12000  01FEB2012
ET004 TSG $5000  02MAR2012
EC002 CSG $23000 01APR2012
ED004 QSG        01AUG2012
;
run;
proc  print  data=user.sales  noobs;
run;

上述input代码解读:

input  Emp_ID  $1-5  Dept  $7-9  +1  Sales  comma6.  @18  Date  date9.;

·第1~5列写入Emp_ID,列控制指针在第6列。

·第7~9列写入Dept,这时列控制指针在第10列。

·+1将列控制指针移到第11列。

·开始读入comma6.中指定的6列,即将第11~16列使用输入格式转换 后写入Sales,这时列控制指针在第17列。

·@22将控制指针直接移到第22列,读入date9.中指定的9列,即第22~30列,然后使用该输入格式进行转换,并写入Date。

常用数字与字符输入格式:

 

表2.1常用数字和字符输入格式

sas读取hadoop sas读取数据集_数据值

 

表2.2 常用的SAS日期、时间、日期时间输入格式

sas读取hadoop sas读取数据集_sas读取hadoop_02

 

 

4、带修饰的列表输入

在学习格式化输入时,我们知道了输入格式的概念。本节将列表输入、输入格式和修饰符结合起来,结合后就成了带修饰的列表输入(modified list input),这样可以使用列表输入方式更灵活地读入数 据。前面讲到列表输入时,提到列表输入的一些限制,例如所创建的变 量长度为8个字节、默认(分隔符为空格时)不能读入包含嵌入空格的 数据值、不能处理带特殊字符的数字值和日期等。SAS提供如下格式的 修改符来消除这些限制,进而增加了列表输入的灵活性。

5、命名输入

命名输入(named input)读取包含变量名、等于符号和变量值的输入数据,例如Name=Willam。

C001   Name=Willam  Age=43
C002   Name=Emily  Age=35
C002   Name=Geroge  Age=45
C005   Name=Jimmy  Age=41

命名输入的基本形式如下:

INPUT  变量1= <$>       <变量2=      <$>   …>;

 

data  user.customer;
input  Customer_ID  $  Name=  $  Age=;
datalines;
C001   Name=Willam  Age=43
C002   Name=Emily  Age=35
C002   Name=Geroge  Age=45
;
run;
proc  print  data=user.customer  noobs;
run;