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