1 在INFILE语句中使用选项控制输入(infile选项)
infile语句中的选项,放在infile语句中文件名的后面,可以改变SAS读取原始数据文件的方式,对于读取特定类型的数据文件非常有用。
FIRSTOBS=
用于告知SAS是从第几行开始读取数据。这对于哪些在开头有描述性文本和头信息的数据文件非常有用。
OBS=
用于告知SAS读取到数据文件哪一行时停止。「OBS=」选项常和「FIRSTOBS=」选项一起使用,以便从数据文件的中间读取文件
MISSOVER
默认情况下,SAS读完一行数据后,如果input语句中还有一些变量没有赋值,SAS将会在下一数据行读取数据。「MISSOVER」选项会告知SAS:当一行数据读完的时候不要转到下一行,而是为其余的变量分配缺失值。
TRUNCOVER
当你使用列输入或者格式输入读取数据时,并且一些数据行比其他行短的时候,你需要使用「TRUNCOVER」选项,该选项作用时告知SAS为变量读取数据,直到遇到数据行的结尾,或者遇到了在格式或列范围指定的最后一个列。二者以先遇到者为准。
TRUNCOVER 和 MISSOVER 类似,要注意区分:
- 联系:如果数据行在变量作用域开始之前就结束,它们都会为变量分配缺失值
- 区别:如果数据行在变量作用域中间结束,TRUNCOVER 将尽量读取可用数据,而MISSOVER 会直接为变量分配一个缺失值
2 使用DATA步读取分隔文件(infile选项)
分隔文件是一种使用特殊字符分隔数据值的原始数据文件,通常使用逗号(,)或制表符(Tab)作为分隔符,SAS为infile语句提供了连个使其更容易读取的选项:DLM= 选项和 DSD 选项。
DLM=选项
若期望读取的数据文件分隔符是空格,则可以使用列表输入读取数据。但若是其他分隔符,这时就需要使用infile语句中的DELIMITER= 或 DLM= 选项,来读取使用任意分隔符的数据文件,只需要把分隔符方在 DLM= 选项后面的等号中(如 DLM='&')。如果分隔符是一个字符串,则使用 DLMSTR= 选项。
示例:infile 'D:code est.dat' DLM = ',' ;
注意,若分件使用制表符(Tab)分隔,则 DLM='09'X (ASCII码)。
DSD选项
默认情况下,SAS将两个或更多的连续分隔符解释为一个分隔符。如果你的文件有缺失,且连续两个分隔符代表缺失值,那么将使用到infile语句中的DSD选项(分隔符敏感数据),它有三层作用,并可以配合 DLM= 选项使用。
- 忽略用引号括起来的数据值中的分隔符
- 不会把引号作为数值的一部分读取
- 把两个连续的分隔符视为缺失
示例:infile 'file - specification' DLM = '09'X DSD ;
CSV文件
逗号分隔符文件被称为CSV文件,针对这类文件,通常采用DSD选项来进行读取。但存在一种特殊情况:在数据行的末尾可能出现缺失值,这时就需要 DSD选项 和 MISSOVER选项 连用,告知SAS当一行数据不够时,不要跳到下一行继续读取。
示例:infile 'D:code est.csv' DLM = ',' dsd missover ;
3 使用IMPORT过程读取分隔文件(import)
SAS中通常有不止一种方法来达到相同的结果
前面已经学习过使用DATA步读取分隔文件,接下来学习的IMPORT过程,也能实现同样的结果。
PROC IMPORT
import过程会自动扫描数据文件前20行,以自动确认变量类型(数值型或字符型)。它还能为字符型指定长度及识别一些日期格式。同时,proc import 会把数据文件中连续的分隔符视为缺失值,读取引号中包含的数据值,以及当数据读完的时候为其余的变量分配缺失值。而且,可以根据需要,把数据文件中的第一行作为变量的名称。
示例:proc import datafile = 'filename' out = data-set ;
filename是想要读取文件的名称,data - set是要创建的SAS数据集的名字。同时,SAS将通过文件的拓展名来确认文件的类型:
文件类型 | 拓展名 | DBMS 标识符 |
---|---|---|
逗号分隔的 | .csv | CSV |
制表符分割的 | .txt | TAB |
使用其他分隔符分隔的 | DLM |
如果文件没有适当的拓展名,或文件是某种DLM类型,则必须再 proc import 中使用 DLMS= 选项。如果已经有一个和 out= 选项中同名的SAS数据集,并且想要覆盖它,则需要使用 REPLACE 选项。
proc import datafile = 'filename' out = data-set
dbms = identifier replace ;
可选语句
一些文件类型需要用一些额外的指令才能正确读取。
- 如果数据文件不是在第一行,可以使用 DATAROWS 语句
- 如果分隔符号不是逗号、制表符或者空格,可以使用 DELIMITER 语句
- 如果文件只包含数据,没有标题行,可以使用 GETNAMES=NO 语句分配默认的变量名称
- 如果数据在前20行全是缺失值或者没有代表性的数据,可以使用 GUESSINGROWS 语句,以确保变量被分配了正确的数据类型和长度
datarows = n; /* 从第n行开始读取数据,默认是1 */
delimiter = 'delimiter-character'; /* DLM文件的分隔符,默认是空格 */
getnames = no; /* 不要从输入文件的第一行获取变量名称,默认yes;如果是no,变 量名称为var1、var2、var3等 */
guessingrows = n; /* 使用n行来确定变量的类型,默认20 */
proc import datafile = 'D:code est.csv' out = music replace;
run;
4 使用IMPORT 过程读取Excel文件(import)
在SAS中可以使用 PROC IMPORT 过程来读取Excel文件,需要注意的是 import 过程在不同的系统中(windows和unix)用法有一些区别:
使用import过程读取Excel文件一般形式:
proc import datafile = 'filename' out = data-set
dbms = identifier replace ;
其中filename是要读取的文件;data-set是要创建的SAS数据集名称;replace选项是告诉SAS替换 out= 选项中指定的数据集(若存在的话)dbms= 选项告知SAS要读取的Excel文件类型,但它不是必需的。
DBMS 标识符
三种最常用的标识符是excel、xls、xlsx。
- unix系统中:xls用于读取文件(拓展名.xls);xlsx用于读取文件(拓展名.xlsx)
- windows系统中:xls、xlsx的用法同unix,并且多了excel标识符,可读取所有类型的excel文件
需要区分的是,excel标识符使用了不同的读取技术,所以结果可能会有所不同。默认情况下,xls、xlsx标识符相较于excel会查看更多的数据行来确定列的类型。
可选语句
如果文件中有多个工作表,可以使用 SHEET 语句指定要读取那个工作表。
语法:sheet = "sheet-name" ;
如果只想读取工作表中特定的单元格,可以用 range 指定一个区域。该区域可以是命名区域(如果已定义),或者可以安装以下方式指定所在预取的左上和右下单元格。a
语法:range = "sheet-name$UL:LR" ;
默认情况下,import过程使用电子表格的第一行作为变量的名称。如果你不想这样做,可以向该过程添加 GETNAMES 语句(仅限excel标识符),SAS会将这些变量命名为F1、F2等。
语法:getnames = no ;
当使用excel标识符时,如果有一列同时包含数值和字符值。默认情况下,数值将被转换成缺失值。为了将数值读取成字符类型而不是缺失值,可以使用 MIXED 语句。
语法:mixed = yes ;
proc import datafile = 'D:code est.csv' dbms = xls out = music replace;
run;