SAS学习系列03导入数据Ⅰ

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

03.导入数据I
SAS读取的数据的方法主要有以下几种:
1. 直接输入;
表格形式输入数据,可以定义变量、设置属性;
程序编辑器data步中直接输入;
2. 从原始数据文件中创建一个SAS数据集;
data步可以读取任何形式的原始数据文件,也可以用导入向导
3. 将其他软件中的数据文件转换成SAS数据集;
如果安装SAS/ACCES模块,可以用导入过程和导入向导将Exce、Lotus、dBase和Access文件导入SAS数据集
4. 直接读取其他软件的数据集;
SAS/ACCES产品可以不用转换数据格式读取数据库管理系统,包
括ORACLE,DB2,INGRES SYBASE勺数据;使用Excel engine Access engine和SPSS engin来读取其数据
(一)直接输入
1. 打开【工具】一一【表编辑器】,在表编辑器窗口以表格形式
输入数据,可以定义变量、设置属性。

(略)
2. data步中直接输入(例如SAS介绍及基础篇中的例1)
(二)用导入向导(Import Wizard)读取文件
步骤:
1. 打开【文件】一一【导入数据】,调出导入向导窗口;
2. 选择要导入的数据类型;
3. 指定要导入的文件位置,SAS默认第一行存放变量名,从第二行开始存
放数据(Options可以改变这种默认选择);
4. 选择数据集要存放的地址,并为数据集命名;
5. (可选)创建一个proc import语句,可以执行它再次导入这个数据。

(三)从外部文件导入数据
」、读取空格或分隔符分开的数据
语法:
data数据集名;
infile文件路径+文件名' <可选参数>;
in put变量1变量2…;
注:infile语句告诉SAS外部数据的存放路径和文件名;示例:
data stude nts;
infile 'c:\MyRawData\Stude ns.dat' DLM =',';
in put Name $ Age Height;
注:这是创建临时数据集work.stude nts,若要创建永久数据集,
需要指定二级数据集名称。

例如,
DLM =
libn ame myworks 'D:\SASWorks' data myworks.students;
infile
'c:\MyRawData\Stude ns.dat'
in put Name $ Age Height;
1. 最简单的数据文件
(1) 至少被一个空格,缺失值用“ •”表示; (2) 字符串不含空格,少于8个字符;
(SAS 默认字符串是8个字符,多于8个字符需要指定列宽) 例1读取路径
下的数据文件ToadJump.da ,内容如下:
Lucky 2.3 1 * 9 . 3 ・ 0 Spot 4.6 2.予 3.1 Tubs 7.1・.孑・8
Hop 4.5 3.2 1•9 2•6 Woisy 3.8 1,3 1.8 1. 5
Winner 5*7 . * *
代码:
data toads;
infile 'c:\MyRawData\ToadJump.dat' ;
in put ToadName $ Weight Jump1 Jump2 Jump3; run ; proc print data = toads; title 'SAS Data Set Toads' ; run;
运行结果:
Nguyen
Ra.mos Robbins
SAS Data Set Toads
注:(1) Nosiy 的数据溢出到第二行了,但这不影响, SAS 会按 照变量顺序自动跳到下一行读取;
(2)程序将不加选择的逐行逐列的读入所有数据记录。

in file 语句可以加上可选参数,
2. MISSOVER 选项(处理每行数据个数长短不一)
in put 语句中输入的几个变量,SAS 在观测值中就读取几个变量, 如果一行
未读完,则进入下一行直到输入的变量都读取了变量值。

可 以让SAS 不进入下一行读取,未赋值的变量读为缺失值。

例2读入下面数据(c:\MyRawData\AllScores.dat ),一个学生应该有
5门课的成绩,但由于最后两门是自学课程,不是所有学生都完成, 故而缺失:
此时就需要加上 MISSOVER 。

89 76 91 82 67 72 80 76 86 7 6 65 79
代码:
data class102;
infile 'c:\MyRawData\AIIScores.dat' MISSOVER;
in put Name $ Test1 Test2 Test3 Test4 Test5;
run ;
proc print data = class102;
run;
运行结果:
Obs Name Test 1Test2Test3Test4Testb
1Nguyen89769182-
2Ramos6772807686
3Robb i ns766579■
3. DLM和DSD选项
默认读入的数据是空格分隔,若是其它分隔符分隔,在infile语句中加上DLM=分隔符':
逗号分隔----- DLM = ‘,'
制表符分隔一一DLM= 09'X (制表符的十六进制值是09)
有时后面需要再加上DSD,有三个作用:
a. 忽略引号中数据的“假分隔符”(例2);
b. 自动将字符串中的引号去掉;
c. 将两个相邻的分隔符当作缺失值来处理。

例3读取路径
下的数据文件Bands.csv内容如下: Lupine Lights,12/3/2003,45F63,70r
Awe3ome Oc taves, 12/15 /2003 ”17 r2 8 H 44 12
"St op t Drop, and RockRoll-t1/5/2004,34, 62,77.91
The Sil veyville Jazz Quartet,1/18/2 004 y 38 f30 f42,43 Catalina Converts ?1/3 1/2004, 56, ,65,34
注意第3行引号中的逗号并不是分隔符,另外,每行数据长短不一样,
所以还需要加上MISSOVER.
代码:
run ;
proc print data = music; title 'Customers at Each Gig' run;
运行结果:
Customers at Each Gig
Obs B andName G i gDate hightPM Ni nePM TenPM tlevonPM 1Lupine Lights19330456370
2Awesome Octaves19342172044 12 3Stop, Drop, and Rock-N-Ro I I 1930334027791 4The S iI veyv i 11e Jaz^ Quartet193763830+243 5Cats 1ina Converts1933956-总534
4. FIRSTOBS = m OBS选项
有的数据文件包括数据的描述,需要用该选项告诉SAS从第m 行开始读取到第n行结束
例4读取如下的数据文件(
lceCreamSales2.dat :
FIRSTOBS = 3
Ice-cream sales dat a for the summer Flavor Locat i on Boxes sold Chocolate 213 123 Van ilia
213 512 Cliocol ate 415
24 2
Dat a. ve r if ied t>y ElaKe Wh i te
注意第3行到第5行是有效数据。

代码:
data icecream2;
in file 'c:\MyRawData\IceCreamSales2.dat' OBS=5; in put Flavor $ 1-9 Locati on BoxesSold; run ;
proc print data = icecream2; run ;
运行结果:
SAS 系统
Obs r 1avor
Locat i on BoxesSo1d
1 ChoGOlate 213 123
2 Vani 1 la
213 512 3 Chocolate
415
242
读取按固定列排列的数据
(1)同一变量的值都占据相同范围的列内; (2)变量值是字符串或者标准数值。

例5读取路径
Columbia Peaches
Plains Peanuts
Gilroy Garlics Sacramento Tomatoes
1O1035 12 11 7 6 124 85 15 4 9 1
注:标准数值是指数据、小数点、正负号、和科学计算法的E。

逗号数据和日期都不是标准数值。

比第1种的优势在于:
不要求变量值之间有空格;缺失值可以直接用空格代替;
字符串中可以包含空格;
可以跳过不需要的变量。

语法:
in put 变量1 n-m …;
注:“n-m”表示变量1数据所占的列范围,第n列至第m列
示例:
in put Name $ 1 - 10 Age 11-13 Height 14- 18;
1.标准按固定列排列的数据
下的数据文件OnionRing.dat,内容如下:
文件[F)再辑(E)恪式(O)査看M粘助(H)
35 67 1 10 2 1
210 2 5 0 2
代码:
data sales;
in file 'c:\MyRawData\O nionRin g.dat' ;
in put Visit in gTeam $ 1- 20 Co ncessio nSales 21-24 BleacherSales 25 - 28 OurHits 29-31 TheirHits 32- 34 OurRuns
John Ga r c ia Sylvia Chung Martha Newto口
注意三行的长度都不一样, in put中只能指定最长的一行
运行结果:
SAS Data Sales
Obs V i s i t i ngTeam Concess i onSa1es BleacherSa1es OurH i is The i rti i Our Runs The i rRuns 1f ig 1umh i a 日3567I102 1 ?Plains Peanuts210■2502 3Qi 1 toy Gar 1ics1510351211 76
A Sacramento Tomatoes124851549 1
2. TRUNCOVE选项
使用按固定列的in put或控制格式(下节)的in put输入时,若某行的数据(+空格)没有占到指定列的宽度,可能会转到下一行读取,此时必须用TRUNCOVE选项,以避免发生这种错误。

例6 读取如下数据(c:\MyRawData\Address.dat):
114 Maple Ave »
13 02 Was hing ton Dr ive
45 S,E.丄4th St.
代码:
data homeaddress;
infile 'c:\MyRawData\Address.dat' TRUNCOVER
in put Name $ 1-15 Number 16-19 Street $ 22- 37;
run ;
proc print data = homeaddress;
运行结果:
例7读取路径下的
数据
Alic j_a Grossman Matthew Lee Eliz abeth Garc ia Lor i Newcornbe Jose Mart Inez
Br i an ?Jill lams
10-23-2003
10-30^2003 丄
0-29^2003
10-30-2003
10-31-2003
10^29-2003
SAS系统
Obs N ame Number Street
1John Garc i a114M aple Ave.
2Sylvia Chung1302Wash i ngton Dr i ve
3Martha Newton45S. E. 14th St.
三、读取非标准格式的数据文件
非标准格式的数据,包括日期数据、“ 8,765,432’、含美元符号、十六进制数等。

语法:
in put变量名变量格式…;
示例:
in put Name $ 10. Age 3. Height 5.1 BirthDate MMDDYY10.;
代码:
6.5
8.9 9.510.0
7.8 6. 5 7.2 3.0 7.9
6 ・0 8 . 1
7.9 8.5 9.0 B.S
运行结果:
Pumpkin Carving Contest
Obs N ame Age T ype Date Scorel Score2Score3Score4Scored 1A1 icia Grossmari13G192947. 3 5.57.2 3.07.9 2Matthew Lee9D19296 6 5 5.9 6 S8.0&. 1 3E1izabeth Garcia10C192958. 97.98.59.0 6.8 4Lor i NeAucotnbe6D19296 6. 7 5.6 4. 9 5.2 6.I 5Jose Martinez1d192978 99,510. 09.79. n 6Brian Willi MS11 G192957. 8 3.48.57.98. 0
程序说明:
(1)“Name $ 10. ”表示字符型变量Name,共占10列宽度,无小数位;
(2)“Height 5.1 ”表示数值型变量Height,共占5列宽度,其中1位小数位;
(3)“+1”表示跳过一列,即原始数据中Age后面有一个空格;
(4)“ MMDD YY10.”共占10位的日期格式;
(5)Score1 Score2 Score3 Score4 Score5 五个变量格式相同,可以用小括号共同指定格式;
附:变量格式及实例列表
通常可以混合使用前面的三种方式,例如,
例8读取路径下的数据文件NatPark.dat,内谷如下:
Yellows tone Everglades Yosemi t e TD/MT/WY 1872 4f G 65( 493 FL 1934 1,398,300
CA 13 6 4 7 60 r 917
Great Smoky Mountains NC/TN 192 6 520 r 259
Wolf Trap Farm VA 19 6 6 13 0
代码:
data nationalparks;
infile 'c:\MyRawData\NatPark.dat'
run ;
run ;
运行结果:
SeIected Nat i onaI Parks
Obs P arkName State Year Acreage
1Ye 11owstone1D/MT/WY187********
2Everglades FL 19341398800
3Yosem i te CA 1864760917
4Great Smoky Mounta i ns NC/TN1926520269
5Wo 1f Trap Farm VA 1966130
程序说明:
符号“ @是列指示器,“ @40”告诉SAS在读取Acerage变量之前,移动到第40列去;若没有“ @40', Comma9告诉SAS读取9列,将会读取包括空格在内的9列,这便会导致输出结果有问题:
SeIected Nat i onaI Parks
Obs ParkName State Year Acreage
1Ye 1lowstone1D/MT/WY18724065
2Everglades FL 1934-
3Yosem ite CA1864-
4Great Smoky Mountai ns NC/TN1926 5
5Wolf Trap Farm VA1966 -
示例: Value of variable DogBreed
Rottweil
R 口七tweiler Vet Bill R D ttweilet
四、读取凌乱的数据
有的数据排列混乱,长度不一,不知道从哪列开始,但是要读取 的数据前面的字符或单词是固定的。

可以利用列指示器“ @ +固定
字符串,定位位置来读取数据。

语法:
in put @字符串’变量名…;
in put @'Breed:' DogBreed $;
另外,in put 读取字符串变量默认为8个字符,若超过8个字符, 则需要定义长度,定义为$length ,在该长度中,空格也算在内。

若要 使SAS 读取过程中遇到空格则不再继续读取,则要在 $length 前面加 冒号“:”。

比如原始数据中有这么一行:
My dog Sam Breed: Rottweiler Vet Bills: $478
用下述述不同方法读取,会有不同结果:
Statements
TNPUT @ Breed :* DogBr e ed $ ; INPUT Breed:* DogBreed $20.; INPUT
Breed:f DogBteed : S20
例9读取路径
下的数据文件Canoes.dat,内容如下:
^ellatorum School: CSULA Time: 1:40. 5
The Kraken School: ASU Time: 1:45. 35
Black Widow School: UoA Time:1:33. 7 Koicrete School: CSUF
Time: 1:40+25
Khaos School: UNLV Time: 2:03, 4o
Max School: L'CSD Time: 1:26. 47
Hakuna Matata School: UCLA Time: 1:20.64 Prospector School:
CPSLO Time: 1:12,08 Andromeda School: CPP Time: 1:25. 1
Kekoapohaku School: UHM Time: 1:24+49
读取学校名和时间
代码:
data canoeresults;
run ;
运行结果:(注意:时间转化为以秒为单位)
Concrete Canoe Men1 s Sprint ResuIts
Obs S choo II Race Ii me
1CSULA100, 50
2ASU105.35
3UoA93.70
A CSUF100. 25
5UNLV123.4&
6UCSD86,47
7UCLA80. 64
8CPSLO72+ 08
9CPP85. 10
10U HI-184, 49程序说明:
例10读取路径
下的数据文件weblogs.txt ,内容如下:
130.192*70.235 123.32-23E.8 - 12S.32.23f.3 - 12S.32,23£.0 - 118.171.121.37 12Ba23.121.37 12Bvl23.121.37 123.75.22E.9 -
(1) @' School 和@' Time 来指定读取学校名和时间的起始位
置;
(2)由于Time 占的字节数不同,用了冒号修饰符,:STIMER8•来 读取时间,STIMER8是时间格式。

若没有冒号修饰符,当遇到字符位 数不够时,
SAS W 会跳到下一个数据行去接着读取,输出错误结果:
Concrete Canoe Men' E Spr i nt ResuIts
Obs S choo 1 RaceT i me
1 CSULA
0. 00 2 JoA
0. 00 3
U NLV 123, 45
A U CSD
86. 47
5 UCLA
80. 64 6
C PSLO 72. 08 7 CPP
0. 00
-{0B/Jun/2001!23:51:32 -070QJ “GET /tovec.jpg HTTP”■丄"200 ££820 [OB/Jun/2001:23:51:40 -0700J "GET /gtoomincf.hual HTTF“・tF 2G0 S471 [QB/Jun/2001:23:51:40 -070Q] "GET /Icons/brush. tji£ HTTP/1.0rr 200 89 [D0/Jlin/2Oai :23i 51:^0 -0700] “GET IiTTP/1.0" 200 1S52
-[0e/Jun/20ai:23:5£:4c -0700] "GET /bath, gi£ HTTP/EO" 200 1407S -^09/Jun/2a01:00:57:49 -0700] "GET /Lobo.gif HTTP /l.D" 200 18312
-[05/Jun/20D1;00:57:4S -D70D1 "GET
/staternnt-h-tiii HTTP/l.tT 二的 230 r09/Jun/2DQl :01:
59:40 -D7D01 "GET /Icons/leash. aif HTTP/1.0tr 200 98
读取其中的访问日期和访问的文件名
代码:
运行结果:
Dog Care Web Logs
Obs A ccessDate Fi le
115134/rover. jpg
215134/groom i ng. htm I
315134/1 cons/brush. gi f
415134/IH .poodle, gif
515134/bath, gif
615135/Iobo. g i f
715135/statemnt. htm
815135/Icons/leash. gif
五、读取非“一行一个观测值”数据、有选择地读取观测值
1.跨行观测值数据
例11读取路径下的数据文件Temperature.dat,内容如下:
Nome AK
55 44
88 29
Miami FL
Raleigh NC
88 68
10 5 50
注意一个观测值占据3行
代码:
in put City $ State $
/ NormalHigh NormalLow
#3 RecordHigh RecordLow; run ;
proc print data = highlow;
title 'High and Low Temperatures for July' run ;
运行结果:
H i gh and Low Temperatures for Ju Iy
Obs C ity State Norma 1H i gh Norma 11 ow Recor dll i gh Record! ow 1Nome AK55448829 2Mi an i FL90759765 3Raleigh NC 886810550
程序说明:
(1) SAS先读取第一行的city变量和state变量,斜线/告诉SAS
移动到下一行的第一列,以便读取normalhigh和normallow.
(2) #3告诉SAS移动到第三行的第一列以便继续读取观测值的recordhigh 变量禾口recordlow 变量。

2. 一行有多个观测值的数据
当一行出现多个观测值时,可以在in put语句结尾加一个停止符号@@.
例12读取路径下的数据文件Precipitation.dat,内容
如下:
Nome AK 2.5 15 Miami FL 6.75
18 Raleigh NC ’12
注意第一行包含2个观测值。

代码:
data rain fall;
in file 'c:\MyRawData\Precipitatio n.dat' ;
in put City $ State $ NormalRain Mea nDaysRain @@;
run ;
proc print data = rain fall;
titlel 'Normal Total Precipitatio n and' ;
title2 'Mea n Days with Precipitatio n for July' ;
run ;
运行结果:
Norma I TotaI Prec i p i tat i on and
Mean Days w i th Prec i p i tat i on for Ju Iy
Obs City State NormaIRa i n MeanDaysRa i n
1Nome AK 2. 5015
2Miami FL 6. 7518
3Raleigh NC *12
3. 有选择地读取部分观测值
有时候只需要读取原始数据的部分观测值,比如只需要年鉴中的
女性数据、收入超过10万的人口数据等。

实现方法:
在SAS读取某一行观测值时,先读取到“判断”变量,然后在in put 语句结尾加符号@,(叫做trailing at),告诉SAS先停在此行,同时用if语句检测此观测值是否满足条件,若满足,那么可以再用一个in put 语句来读取其它变量。

例13 交通数据(c:\MyRawData\Traffic.dat)包含街道的类型(freeways
和surface)、街道名称、早晨每小时的机动车流动量、晚上每小时机动车流动量。

freeway408 3 6843459
SUr tace Mart in Lu ther King Jr. Blvd.X59012 3 4
Sur face Br cadway12591290
sur face Ro deo Dr .189020 67
freeway608458338 60
freeway808238625 18
sur fact?Lake Shore Dr » 1 59012 3 4
suiface Pennsylvania Ave *12591290
要求只读取freeway的数据。

代码:
data freeways;
infile 'c:\MyRawData\Traffic.dat'
in put Type $ @;
if Type = 'surface' then DELETE; in put Name $ 9-38 AMTraffic PMTraffic; run ;
proc print data = freeways;
title 'Traffic for Freeways' ;
run ;
运行结果:
Traff i c for Freeways
Obs T ype Name AMTraffic P MTraffic
1ireeway40836843459
2freeway60845833860
3freeway80823862518注:@的作用类似于@@,都是行停留指示符,不同地方在于停
留多久,@能使SAS停留到下一个in put语句(也不换行),@@能使
停留的时间到下一个data步(也不换行)
比如这段代码:
data test;
in file cards ;
in put x @;
in put y;
in put z @@; cards ;
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17
run ;
proc print data = test;
run ;
test输出结果就是:
Obs X y z
1 1 21
28913。

相关文档
最新文档