1 在INFILE语句中使用选项控制输入(infile选项)

infile语句中的选项,放在infile语句中文件名的后面,可以改变SAS读取原始数据文件的方式,对于读取特定类型的数据文件非常有用。
FIRSTOBS=

用于告知SAS是从第几行开始读取数据。这对于哪些在开头有描述性文本和头信息的数据文件非常有用。

用于告知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\test.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\test.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 标识符

    如果文件没有适当的拓展名,或文件是某种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\test.csv' out = music replace;
    

    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\test.csv' dbms = xls out = music replace;