上面一节讲了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常用数字和字符输入格式
表2.2 常用的SAS日期、时间、日期时间输入格式
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;