1、SAS读取数据的方法
ViewTable直接输入;导入向导将外部数据导入,创建成SAS数据集;使用数据步读取外部数据,或者内部创建SAS数据集;使用过程步读取外部数据,或者内部创建SAS数据集;
2、用ViewTable输入数据
调用ViewTable窗口,在工具栏的下拉菜单中选择表编辑器,在ViewTable中直接输入数据。
3、用导入向导读取文件
导入向导会浏览你的文件以决定变量的类型,并默认数据表的第一行存放变量名,Options可以改变这种默认设置。
4、SAS读取原始数据
内部原始数据:如果直接将数据输入SAS程序中,那么数据就是SAS内部数据。例如:
data a;
input president $ party $ number;
datalines;/*可以用cards代替datalines*/
Adams F 2
Lincoln R 16
Grant R 18
Kennedy D 35
;
run;
外部原始数据:数据在SAS程序外部时,使用infile语句告诉SAS外部数据的文件名和存放路径,它在data语句之后,在input语句之前。infile后面的文件名和路径要用引号,各种系统的引用方式不同。
例如:
/*读取C盘MyRawData目录中的文件test.dat*/
data b;
infile 'c:\MyRawData\test.dat';
input president $ party $ number;
run;
5、INPUT读取外部数据
(1)list input读取空格分开的原始数据
/*形式如下:*/
input Name $ Age Height;
/字符串数据不能包含空格,长度不能超过8个字符,字符串变量用$表示/
(2)column input读取按固定列排列的原始数据
/*形式如下:*/
input Name $ 1-10 Age 11-13 Height 14-18;
/*变量名后的数字代表列位置,允许字符串中包含空格*/
(3)informats读取非标准格式的原始数据
/*形式如下:*/
input Name $10. Age 3. Height 5.1 BirthDate MMDDYY10.;
/informats的三种普遍格式为:字符串、数值、日期,像日期就是最普通的非标准数据/
eg.
input Name $16. Age 3. +1 Type $1. +1 Date MMDDYY10.
(score1 score2 score3 score4 score5)(4.1);
/年龄后的+1代表跳过一列,score1-score5都是4.1格式**/
可选择变量形式:
(4) 混合读取方式
/*形式如下:*/
input ParkName $ 1-22 State $ Year @40 Acreage COMMA9.;
/ParkName是column方式读取,State和Year是list方式读取,Acreage是formatted方式读取/
list方式下:SAS自动找到非空格区域开始读取;
column方式下:SAS读取你指定的特定位置;
informatted方式下:SAS依次读取,不会按照指示器提示读取;
指示器@40告诉SAS在读取Acreage之前,移动到第40列去。
(5)读取凌乱的原始数据
当数据排列凌乱,长度不一时,需要使用@'character'列指示器和colon modifier。
/*@'character列指示器'*/
input @'[' AccessDate DATE11. @'GET' File :$20.;
/*@'['告诉SAS读取[之后的数据,@'GET'告诉SAS读取GET之后的数据,:$20指明File的长度为20*/
/colon modifier/
File :$20. 在$20前加上冒号(:)告诉SAS遇到空格不再继续读取
(6)跨行观测值的读取方式
/*形式如下:*/
input City $ State $
/ NormalHigh NormalLow
#3 RecordHigh RecordLow;/*#n代表跳至第n行*/
/*先读取第一行的City和State,
斜线(/)告诉SAS移动到下一行的第一列,读取NormalHigh和NormalLow,
#3告诉SAS移动到第三行的第一列继续读取RecordHigh和RecordLow,
/可以用#2代替,也可以用/代替#3*/
(7)一行有多个观测值的原始文件读取
/*当一行出现多个观测值时,可以在input语句结尾加一个停止符号@@*/
/*形式如下:*/
input City $ State $ NormalRain MeanDaysRain @@
原始数据:
Nome AK 2.5 15 Miami FL 6.75
18 Raleigh NC . 12
读取之后的数据:
(8)读取原始数据的部分观测值
/*读取部分观测值时,在input语句结尾加上@,让SAS先停在此处,同时用IF语句筛选出
符合条件的数据,再用一个input语句来读取剩下的变量*/
/*形式如下:*/
input Type $ @;
if Type='surface' then delete;
input Name $ 9-38 AMTraffic PMTraffic;
原始数据:
读取之后的数据:
@vs@@:
@和@@都是行停留指示符,@能使SAS停留到下一个input语句(也不换行),@@能使停留的时间到下一个data步(也不换行)。
(9)用infile语句中的选项控制输入
/*A、FIRSTOBS=
FIRSTOBS=告诉SAS从哪一行开始读取数据。
*/
data icecream;
infile 'c:\MyRawData\Sales.dat' FIRSTOBS=3; /*FIRSTOBS=3让SAS从第三行开始读取数据*/
input Flavor $ 1-9 Location BoxesSold;
run;
/*B、OBS=
OBS=告诉SAS一直读取到哪一行位置,注意是行而不是观测值(有的观测值占据多行)
*/
data icecream;
infile 'c:\MyRawData\Sales.dat' FIRSTOBS=3 OBS=5; /*让SAS读取第三行到第五行的数据*/
input Flavor $ 1-9 Location BoxesSold;
run;
/*C、MISSOVER
在input语句中输入的几个变量,SAS在观测值中就读取几个变量,如果一行未读完,则进入下一行直到输入的变量都读取了变量值。missover可以让SAS不进入下一行读取,未赋值的变量就使其成为缺失值。
*/
data class;
infile 'c:\MyRawData\Scores.dat' MISSOVER;
input Name $ Test1 Test2 Test3 Test4 Test5;
run;
/*假设原始数据如下:*/
Nguyen 89 76 91 82
Ramos 67 72 80 76 86
/*MISSOVER让SAS将Nguyen第五门课的成绩设为缺失值,从而不牵扯到下一行*/
/*D、Truncover
使用column input或formatted input输入时可能会需要这个选项,因为这时有的数据行比其他的短
*/
data homeaddress;
infile 'c:\MyRawData\Address.dat' Truncover;
input Name $ 1-15 Number 16-19 Street $ 22-37;/*Street最多占到第37列,若某些行没有占到第37列,用Truncover可以使较短的行不受影响地读取*/
run;
(10)用数据步读取分隔符文件
DLM=和DSD选项可以使SAS容易地读取用分隔符隔开的文件。
data reading;
infile 'c:\MyRawData\Books.dat' DLM=',';/*DLM=','代表读取以逗号隔开的文件*/
input Name $ Week1 Week2 Week3 Week4 Week5;
run;
DSD的作用:
忽略引号中数值的分隔符;自动将字符数据中的引号去掉;将两个相邻的分隔符当做缺失值处理。
6、用导入过程(import)读取分隔符文件
注意事项:
如果想要创建的数据集名字已经存在,那么要用replace选项代替;getnames=yes意味着导入数据的时候,第一行是变量名,getnames=no意味着导入数据的时候,第一行是数据;
如果你的数据文件是DLM类型的,PROC IMPORT会假定分隔符为空格,用DELIMITER=可以改变默认的分隔符;
例子:
proc import datafile="c:\MyRawData\Bands.xlsx" out=music
dbms=xlsx replace;
sheet="sheet1";
getnames=yes;
run;