SAS学习系列03导入大数据Ⅰ.docx
《SAS学习系列03导入大数据Ⅰ.docx》由会员分享,可在线阅读,更多相关《SAS学习系列03导入大数据Ⅰ.docx(19页珍藏版)》请在冰豆网上搜索。
SAS学习系列03导入大数据Ⅰ
03.导入数据Ⅰ
SAS读取的数据的方法主要有以下几种:
1.直接输入;
表格形式输入数据,可以定义变量、设置属性;
程序编辑器data步中直接输入;
2.从原始数据文件中创建一个SAS数据集;
data步可以读取任何形式的原始数据文件,也可以用导入向导(ImportWizard)、导入过程(IMPORTprocedure)
3.将其他软件中的数据文件转换成SAS数据集;
如果安装SAS/ACCESS模块,可以用导入过程和导入向导将Excel、Lotus、dBase和Access文件导入SAS数据集
4.直接读取其他软件的数据集;
SAS/ACCESS产品可以不用转换数据格式读取数据库管理系统,包括ORACLE,DB2,INGRES和SYBASE的数据;使用Excelengine、Accessengine和SPSSengine来读取其数据
(一)直接输入
1.打开【工具】——【表编辑器】,在表编辑器窗口以表格形式输入数据,可以定义变量、设置属性。
(略)
2.data步中直接输入(例如SAS介绍及基础篇中的例1)
(二)用导入向导(ImportWizard)读取文件
步骤:
1.打开【文件】——【导入数据】,调出导入向导窗口;
2.选择要导入的数据类型;
3.指定要导入的文件位置,SAS默认第一行存放变量名,从第二行开始存放数据(Options可以改变这种默认选择);
4.选择数据集要存放的地址,并为数据集命名;
5.(可选)创建一个procimport语句,可以执行它再次导入这个数据。
(三)从外部文件导入数据
一、读取空格或分隔符分开的数据
语法:
data数据集名;
infile‘文件路径+文件名’<可选参数>;
input变量1变量2…;
注:
infile语句告诉SAS外部数据的存放路径和文件名;
示例:
datastudents;
infile'c:
\MyRawData\Studens.dat'DLM=',';
inputName$AgeHeight;
注:
这是创建临时数据集work.students,若要创建永久数据集,需要指定二级数据集名称。
例如,
libnamemyworks'D:
\SASWorks';
datamyworks.students;
infile'c:
\MyRawData\Studens.dat'DLM=',';
inputName$AgeHeight;
1.最简单的数据文件
(1)至少被一个空格,缺失值用“.”表示;
(2)字符串不含空格,少于8个字符;
(SAS默认字符串是8个字符,多于8个字符需要指定列宽)
例1读取路径c:
\MyRawData\下的数据文件ToadJump.dat,内容如下:
代码:
datatoads;
infile'c:
\MyRawData\ToadJump.dat';
inputToadName$WeightJump1Jump2Jump3;
run;
procprintdata=toads;
title'SASDataSetToads';
run;
运行结果:
注:
(1)Nosiy的数据溢出到第二行了,但这不影响,SAS会按照变量顺序自动跳到下一行读取;
(2)程序将不加选择的逐行逐列的读入所有数据记录。
infile语句可以加上可选参数,
2.MISSOVER选项(处理每行数据个数长短不一)
input语句中输入的几个变量,SAS在观测值中就读取几个变量,如果一行未读完,则进入下一行直到输入的变量都读取了变量值。
可以让SAS不进入下一行读取,未赋值的变量读为缺失值。
例2读入下面数据(c:
\MyRawData\AllScores.dat),一个学生应该有5门课的成绩,但由于最后两门是自学课程,不是所有学生都完成,故而缺失:
此时就需要加上MISSOVER。
代码:
dataclass102;
infile'c:
\MyRawData\AllScores.dat'MISSOVER;
inputName$Test1Test2Test3Test4Test5;
run;
procprintdata=class102;
run;
运行结果:
3.DLM和DSD选项
默认读入的数据是空格分隔,若是其它分隔符分隔,在infile语句中加上DLM=’分隔符’:
逗号分隔——DLM=‘,’
制表符分隔——DLM=’09’X(制表符的十六进制值是09)
有时后面需要再加上DSD,有三个作用:
a.忽略引号中数据的“假分隔符”(例2);
b.自动将字符串中的引号去掉;
c.将两个相邻的分隔符当作缺失值来处理。
例3读取路径c:
\MyRawData\下的数据文件Bands.csv,内容如下:
注意第3行引号中的逗号并不是分隔符,另外,每行数据长短不一样,所以还需要加上MISSOVER.
代码:
datamusic;
infile'c:
\MyRawData\Bands.csv'DLM=','DSDMISSOVER;
inputBandName:
$30.GigDate:
MMDDYY10.EightPMNinePMTenPMElevenPM;
run;
procprintdata=music;
title'CustomersatEachGig';
run;
运行结果:
4.FIRSTOBS=mOBS=n选项
有的数据文件包括数据的描述,需要用该选项告诉SAS从第m行开始读取到第n行结束。
例4读取如下的数据文件(c:
\MyRawData\IceCreamSales2.dat):
注意第3行到第5行是有效数据。
代码:
dataicecream2;
infile'c:
\MyRawData\IceCreamSales2.dat'FIRSTOBS=3OBS=5;
inputFlavor$1-9LocationBoxesSold;
run;
procprintdata=icecream2;
run;
运行结果:
二、读取按固定列排列的数据
(1)同一变量的值都占据相同范围的列内;
(2)变量值是字符串或者标准数值。
注:
标准数值是指数据、小数点、正负号、和科学计算法的E。
逗号数据和日期都不是标准数值。
比第1种的优势在于:
●不要求变量值之间有空格;
●缺失值可以直接用空格代替;
●字符串中可以包含空格;
●可以跳过不需要的变量。
语法:
input变量1n-m…;
注:
“n-m”表示变量1数据所占的列范围,第n列至第m列。
示例:
inputName$1-10Age11-13Height14-18;
1.标准按固定列排列的数据
例5读取路径c:
\MyRawData\下的数据文件OnionRing.dat,内容如下:
代码:
datasales;
infile'c:
\MyRawData\OnionRing.dat';
inputVisitingTeam$1-20ConcessionSales21-24BleacherSales25-28OurHits29-31TheirHits32-34OurRuns35-37TheirRuns38-40;
run;
procprintdata=sales;
title'SASDataSetSales';
run;
运行结果:
2.TRUNCOVER选项
使用按固定列的input或控制格式(下节)的input输入时,若某行的数据(+空格)没有占到指定列的宽度,可能会转到下一行读取,此时必须用TRUNCOVER选项,以避免发生这种错误。
例6读取如下数据(c:
\MyRawData\Address.dat):
注意三行的长度都不一样,input中只能指定最长的一行。
代码:
datahomeaddress;
infile'c:
\MyRawData\Address.dat'TRUNCOVER;
inputName$1-15Number16-19Street$22-37;
run;
procprintdata=homeaddress;
run;
运行结果:
三、读取非标准格式的数据文件
非标准格式的数据,包括日期数据、“8,765,432”、含美元符号、十六进制数等。
语法:
input变量名变量格式…;
示例:
inputName$10.Age3.Height5.1BirthDateMMDDYY10.;
例7读取路径c:
\MyRawData\下的数据文件Pumpkin.dat,内容如下:
代码:
datacontest;
infile'c:
\MyRawData\Pumpkin.dat';
inputName$16.Age3.+1Type$1.+1DateMMDDYY10.
(Score1Score2Score3Score4Score5)(4.1);
run;
procprintdata=contest;
title'PumpkinCarvingContest';
run;
运行结果:
程序说明:
(1)“Name$10.”表示字符型变量Name,共占10列宽度,无小数位;
(2)“Height5.1”表示数值型变量Height,共占5列宽度,其中1位小数位;
(3)“+1”表示跳过一列,即原始数据中Age后面有一个空格;
(4)“MMDDYY10.”共占10位的日期格式;
(5)Score1Score2Score3Score4Score5五个变量格式相同,可以用小括号共同指定格式;
附:
变量格式及实例列表
通常可以混合使用前面的三种方式,例如,
例8读取路径c:
\MyRawData\下的数据文件NatPark.dat,内容如下:
代码:
datanationalparks;
infile'c:
\MyRawData\NatPark.dat';
inputParkName$1-22State$Year@40AcreageCOMMA9.;
run;
procprintdata=nationalparks;
title'SelectedNationalParks';
run;
运行结果:
程序说明:
符号“@”是列指示器,“@40”告诉SAS在读取Acerage变量之前,移动到第40列去;若没有“@40”,Comma9告诉SAS读取9列,将会读取包括空格在内的9列,这便会导致输出结果有问题:
四、读取凌乱的数据
有的数据排列混乱,长度不一,不知道从哪列开始,但是要读取的数据前面的字符或单词是固定的。
可以利用列指示器“@”+固定字符串,定位位置来读取数据。
语法:
input@‘字符串’变量名…;
示例:
input@'Breed:
'DogBreed$;
另外,input读取字符串变量默认为8个字符,若超过8个字符,则需要定义长度,定义为$length,在该长度中,空格也算在内。
若要使SAS读取过程中遇到空格则不再继续读取,则要在$length.前面加冒号“:
”。
比如原始数据中有这么一行:
MydogSamBreed:
RottweilerVetBills:
$478
用下述述不同方法读取,会有不同结果:
例9读取路径c:
\MyRawData\下的数据文件Canoes.dat,内容如下:
读取学校名和时间。
代码:
datacanoeresults;
infile'c:
\MyRawData\Canoes.dat';
input@'School:
'School$@'Time:
'RaceTime:
STIMER8.;
run;
procprintdata=canoeresults;
title"ConcreteCanoeMen'sSprintResults";
run;
运行结果:
(注意:
时间转化为以秒为单位)
程序说明:
(1)@’School:
’和@’Time:
’来指定读取学校名和时间的起始位置;
(2)由于Time占的字节数不同,用了冒号修饰符,:
STIMER8.来读取时间,STIMER8是时间格式。
若没有冒号修饰符,当遇到字符位数不够时,SAS将会跳到下一个数据行去接着读取,输出错误结果:
例10读取路径c:
\MyRawData\下的数据文件weblogs.txt,内容如下:
读取其中的访问日期和访问的文件名。
代码:
dataweblogs;
infile'C:
\MyRawData\weblogs.txt';
input@'['AccessDateDATE11.@'GET'File:
$20.;
procprintdata=weblogs;
title'DogCareWebLogs';
run;
运行结果:
五、读取非“一行一个观测值”数据、有选择地读取观测值
1.跨行观测值数据
例11读取路径c:
\MyRawData\下的数据文件Temperature.dat,内容如下:
注意一个观测值占据3行。
代码:
datahighlow;
infile'c:
\MyRawData\Temperature.dat';
inputCity$State$
/NormalHighNormalLow
#3RecordHighRecordLow;
run;
procprintdata=highlow;
title'HighandLowTemperaturesforJuly';
run;
运行结果:
程序说明:
(1)SAS先读取第一行的city变量和state变量,斜线/告诉SAS移动到下一行的第一列,以便读取normalhigh和normallow.
(2)#3告诉SAS移动到第三行的第一列以便继续读取观测值的recordhigh变量和recordlow变量。
2.一行有多个观测值的数据
当一行出现多个观测值时,可以在input语句结尾加一个停止符号@@.
例12读取路径c:
\MyRawData\下的数据文件Precipitation.dat,内容如下:
注意第一行包含2个观测值。
代码:
datarainfall;
infile'c:
\MyRawData\Precipitation.dat';
inputCity$State$NormalRainMeanDaysRain@@;
run;
procprintdata=rainfall;
title1'NormalTotalPrecipitationand';
title2'MeanDayswithPrecipitationforJuly';
run;
运行结果:
3.有选择地读取部分观测值
有时候只需要读取原始数据的部分观测值,比如只需要年鉴中的女性数据、收入超过10万的人口数据等。
实现方法:
在SAS读取某一行观测值时,先读取到“判断”变量,然后在input语句结尾加符号@,(叫做trailingat),告诉SAS先停在此行,同时用if语句检测此观测值是否满足条件,若满足,那么可以再用一个input语句来读取其它变量。
例13交通数据(c:
\MyRawData\Traffic.dat)包含街道的类型(freeways和surface)、街道名称、早晨每小时的机动车流动量、晚上每小时机动车流动量。
要求只读取freeway的数据。
代码:
datafreeways;
infile'c:
\MyRawData\Traffic.dat';
inputType$@;
ifType='surface'thenDELETE;
inputName$9-38AMTrafficPMTraffic;
run;
procprintdata=freeways;
title'TrafficforFreeways';
run;
运行结果:
注:
@的作用类似于@@,都是行停留指示符,不同地方在于停留多久,@能使SAS停留到下一个input语句(也不换行),@@能使停留的时间到下一个data步(也不换行)。
比如这段代码:
datatest;
infilecards;
inputx@;
inputy;
inputz@@;
cards;
123456
789101112
1314151617
;
run;
procprintdata=test;
run;
test输出结果就是: