SAS学习系列03. 导入数据Ⅰ
(部分内容展示,图片省略)
(三)从外部文件导入数据
一、 读取空格或分隔符分开的数据
语法:
data 数据集名;
infile ‘文件路径+文件名’ <可选参数>;
input 变量1 变量2 …;
注:infile语句告诉SAS外部数据的存放路径和文件名;
示例:
data students;
infile 'c:\MyRawData\Studens.dat' DLM = ',';
input Name $ Age Height;
注:这是创建临时数据集work.students,若要创建永久数据集,需要指定二级数据集名称。例如,
libname myworks 'D:\SASWorks';
data myworks.students;
infile 'c:\MyRawData\Studens.dat' DLM = ',';
input Name $ Age Height;
1. 最简单的数据文件
(1) 至少被一个空格,缺失值用“.”表示;
(2) 字符串不含空格,少于8个字符;
(SAS默认字符串是8个字符,多于8个字符需要指定列宽)
例1 读取路径c:\MyRawData\下的数据文件ToadJump.dat,内容如下:
图片略
代码:
data toads;
infile 'c:\MyRawData\ToadJump.dat';
input ToadName $ Weight Jump1 Jump2 Jump3;
run;
proc print data = toads;
title 'SAS Data Set Toads';
run;
运行结果:
图片略
注:(1)Nosiy的数据溢出到第二行了,但这不影响,SAS会按照变量顺序自动跳到下一行读取;
(2)程序将不加选择的逐行逐列的读入所有数据记录。
infile语句可以加上可选参数,
2. MISSOVER选项(处理每行数据个数长短不一)
input语句中输入的几个变量,SAS在观测值中就读取几个变量,如果一行未读完,则进入下一行直到输入的变量都读取了变量值。可以让SAS不进入下一行读取,未赋值的变量读为缺失值。
例2 读入下面数据(c:\MyRawData\AllScores.dat),一个学生应该有5门课的成绩,但由于最后两门是自学课程,不是所有学生都完成,故而缺失:此时就需要加上MISSOVER。
图片略
代码:
data class102;
infile 'c:\MyRawData\AllScores.dat' MISSOVER;
input Name $ Test1 Test2 Test3 Test4 Test5;
run;
proc print data = class102;
run;
运行结果:
图片略
3. DLM和DSD选项
默认读入的数据是空格分隔,若是其它分隔符分隔,在infile语句中加上DLM=’分隔符’ :
逗号分隔——DLM = ‘,’
制表符分隔——DLM=’09’X (制表符的十六进制值是09)
有时后面需要再加上DSD,有三个作用:
a. 忽略引号中数据的“假分隔符”(例2);
b. 自动将字符串中的引号去掉;
c. 将两个相邻的分隔符当作缺失值来处理。
例3 读取路径c:\MyRawData\下的数据文件Bands.csv,内容如下:
图片略
注意第3行引号中的逗号并不是分隔符,另外,每行数据长短不一样,所以还需要加上MISSOVER.
代码:
data music;
infile 'c:\MyRawData\Bands.csv' DLM = ',' DSD MISSOVER;
input BandName:$30. GigDate:MMDDYY10. EightPM NinePM TenPM ElevenPM;
run;
proc print data = music;
title 'Customers at Each Gig';
run;
运行结果:
图片略
4. FIRSTOBS = m OBS=n选项
有的数据文件包括数据的描述,需要用该选项告诉SAS从第m行开始读取到第n行结束。
例4 读取如下的数据文件(c:\MyRawData\ IceCreamSales2.dat):
图片略
注意第3行到第5行是有效数据。
代码:
data icecream2;
infile 'c:\MyRawData\IceCreamSales2.dat' FIRSTOBS = 3 OBS=5;
input Flavor $ 1-9 Location BoxesSold;
run;
proc print data = icecream2;
run;
运行结果:
图片略
二、 读取按固定列排列的数据
(1) 同一变量的值都占据相同范围的列内;
(2) 变量值是字符串或者标准数值。