2.3.4INFILE语句

作用是在数据步中指出用INPUT语句读取的外部数据文件。

1. 语法

INFILE file-specification <options > <operating-environment-options>; 

INFILE DBMS-specifications; 

1)语句参数:

1file-specification 确定输入数据的记录源这是一个外部文件或流内的数据。文件规格可以是这些形式

① 外部文件指定外部文件的物理名称即操作环境访问文件使用的名称。

FileRef指定一个外部文件的文件逻辑名。

必须用FILENAME语句将文件逻辑名与外部文件的文件名联系起来。

要求:你必须与文件名的外部文件中语句的FileRef,文件名的功能,或适当的操作环境的命令。

 Datalines | datalines4

指定输入数据步中紧跟在datalinesdatalines4后面的数据。这允许你使用infile语句选项来控制用INPUT语句读取的数据行。

 

2可选项

(1)COLUMN=变量 (别名:col =

SAS将输入指针定位在当前列的位置。COLUMN=变量不写入数据集。

2DELIMITER=分隔符分隔符(别名:DLM =

指定一个定界符(而非空格)被用于LIST列表输入,分隔符可以是分隔符的列表

字符变量 指定一个字符变量的值作为分隔符。默认值为空格。

例如,下面的程序使用列表读取以逗号分隔的数据。第二行数据包含缺失值。由于SAS允许连续的分隔符和列表输入,输入的语句不能检测到缺失值。

*ex2-3-14;
data scores;
infile datalines delimiter=',';
input test1 test2 test3;
datalines;
91,87,95
97,,92
,1,1
;
PROC PRINT;

run;

运行结果如图2-21 所示。

spacer.gif

2-21 没有检测到缺失值

为正确读取数据,在INFILE语句中增加DSD选项。

3DSD(分隔符的敏感数据)

指定当数据值用引号括起来,值被视为字符数据时的定界符。当你使用LIST输入和设置一个逗号作为默认的分隔符时,DSD选项改变了SAS如何处理分隔符。默认情况下,INPUT语句将连续的分隔符作为一个单位处理。当使用DSD输入语句,将连续的分隔符之间缺少的值被读为缺失值。

*ex2-3-15;

data scores;

infile datalines dsd;

input test1 test2 test3;

datalines;

91,87,95

97,,92

,1,1

;

procprint;

run;

运行结果见图2-22所示。

spacer.gif

图2-22 读有分隔符数据的输出

DSD选项设置逗号为默认的分隔符,。因为在第一数据行的第一个值是一个逗号,缺失值分配给第一次观测的变量X,第2个值赋给变量y

如果数据使用多个分隔符或一个逗号以外的分隔符,那么只需用DELIMITER=选项指定分隔符值。

例2-3-16,字符a或b作为数据间的分隔符:

*ex2-3-16;

data nums;

infile datalines dsd delimiter='ab';

input X Y Z;

datalines;

1aa2ab3

4b5bab6

7a8b9

;

procprint;

run;

分隔符或ab,运行结果见图2-23所示。

 

2-23 DELIMITER=选项读ab作分隔符的数据

如果省略DSD,字符abaaabbbba作为分隔符,没有缺失值分配给变量。如例2-3-17。

*ex2-3-17;

data nums;

infile datalinesdelimiter='ab';

input X Y Z;

datalines;

1aa2ab3

4b5bab6

7a8b9

;

procprint;

run;

结果见图2-24所示。

spacer.gif

2-24 省略了DSD用字符作分隔符读入的数据集

(4)END=变量

命名一个变量,当输入数据记录是输入文件的最后一条记录时,SAS设该变量为1。直到SAS处理数据的最后一个记录,END=变量设置为0。像自动变量一样,这个变量是不写入数据集的。

使用DATALINES或DATALINES4语句时及一个输入语句读取多个输入数据记录时,不能使用END=选项。

提示:当END=无效时,选择使用EOF =

(5)EOV=变量

命名一个变量,在读一系列的连接文件的某文件的第一个记录时,SAS设该变量为1。只有在SAS遇到下一个文件时该变量才设置。像自动变量一样,变量不写入数据集。

提示:SAS遇到的每个边界后, EOV=变量复位变回0

 

6expandtabs | noexpandtabs

指定是否要扩大制表符的标准为8-列的间隔设置,开始在第9列。默认值:noexpandtabs

提示:当你读包含你的操作环境的制表符的数据时,expandtabs是有用的。

(7)FILENAME=变量

命名一个变量,SAS设置为当前打开的输入文件的物理名称。像自动变量一样,变量不写入数据集。

提示:使用LENGTH语句语句使变量长度足够长,以便包含文件名的值。

8filevar =变量

命名一个变量,当infile语句关闭当前输入文件并打开一个新的文件时,该变量值发生变化,filevar变量包含有物理文件名的字符串。下一个INPUT语句执行时,它从filevar =变量指定的新文件读取。像自动变量一样,这个变量不写入数据集。

提示:使用filevar =动态改变当前打开的输入文件为新的物理文件。

9N =可用行数

指定输入指针一次能读的行数。

在DATA步的任何一INPUT语句中跟在#后的指针控制读入行数的最高值。如果忽略了#指针控制,则默认值为1

提示:在INPUT语句若使用#指针控制,当#指针值小于N =值,会得到想不到的结果。为了避免这种情况,INPUT语句中应包括#指针控制等于N =选项的值。例如:

infile 'external file' n=5;

input #2 name : $25. #3 job : $25. #5;

(10)_INFILE_=variable 

命名一个字符变量以便引用INFILE语句的当前输入缓冲区的内容。该变量是自动保留并初始化为空 。像自动变量一样,该_infile_ =变量不写入数据集。

限制:变量不能是预先定义的变量。确保_infile_ =指定的这一变量是在数据步中第一次出现。不能使用LENTH和ATTRIB语句设置或更改_infile_ =变量的长度或属性。然而,你可以使用ATTRIB或FORMAT语句将一个格式附加到这个变量。

对这个变量的修改是直接修改infile语句的当前输入缓冲区。任何PUT _infile_(当此infile是当前的)下的缓冲修改反映了修改缓冲区的内容。该_infile_ =变量只访问指定infile语句的当前输入缓冲区,即使你使用n =选项来指定多个缓冲区。

提示:访问另一个语句的输入缓冲区的内容,不使用_infile_ =选项,而使用自动变量_infile_

(11missover

如果在当前输入行中没有找到INPUT语句中所有变量的值,或者数据长度短于INPUT语句对该字段格式要求的长度时,IPUT语句会继续读下一个输入数据记录。这是输入语句的默认行为。使用missover防止input语句从一个新的行读入数据记录,当INPUT语句到达当前输入数据记录结束时,没有被赋予任何值的变量取缺失值。

例2-3-18 一个外部文件mis.txt包含可变长度记录,有些记录还缺项,内容如下:

1 1

2 22

3 333

5 55555

6 666666

编制程序读取这些数据创建SAS数据集。

*ex2-3-18;

data numbers;

infile 'e:\sasdt\1-5.txt' ;

input a testnum 5.;

run;

procprint;

run;

运行结果如图2-25所示。

spacer.gif

2-25 字段长度太短及缺项数据读错

DATA步从6个输入数据记录中创建4个观测,其中1、2记录读在一起,3、4记录读在一起。第5条记录正常,第6条记录被截短。

如果在infile语句中使用missover选项,能正常读各变量,所有的值被记录,但太短的值和缺项变量被设为缺失值。如图2-26所示。

 

图2-26 使用missover选项读数据结果

 

(12)TRUNCOVER 

当输入数据短于INPUT语句期望的长度时, INPUT语句默认会自动读下一输入数据记录。TRUNCOVER拒绝INPUT语句的默认行为,它能使你读短于INPUT语句期望的变长的数据记录。无任何值赋予变量时,则设置为缺失值。

*ex2-3-19;

data numbers;

infile 'e:\sasdt\1-5.txt' truncover;

input atestnum 5.;

run;

procprint;

run;

运行结果如图2-27所示。

spacer.gif

图2-27 使用truncover选项读数据

truncovermissover选项的作用部分相似。这两个选项都能使INPUT语句正常读出数据中的各记录,设置缺失的变量为缺失值。然而,missover选项,当数据长度短于INPUT语句中指定的字段长时,会将值设为缺失;truncover选项却将读到的内容给相应的变量。

 

例如在e:\sasdt\phonebk.txt 中数据如下:

Jenny's Phone Book

Jim Johanson phone: 619-555-9340

Jim wants a scarf for the holidays.

Jane Jovalley phone: (213) 555-4820

Jane started growing cabbage in her garden.

Her dog's name is Juniper.

J.R. Hauptman phone: (49)12 34-56 78-90

J.R. is my brother.

数据中有些行仅有姓名,想将数据中的电话号输出,可使用'@phone:来扫描文件行中的电话号码将读指针定位在电话号码开始的地方。电话号码只写入日志中。

*ex2-3-20;

data ;

infile 'e:\sasdt\phonebk' truncover;

input @'phone:' phone $32.;

put phone=;

procprint;

run;

运行结果见2-28

spacer.gif

图2-28 用@’phone’扫描行输出

(13)SCANOVER 

引起INPUT语句扫描输入数据记录直到在@'character-string'表达式中规定的字符串被发现才做处理。

2-3-21 上面例子中结合使用scanover truncover跳过不包含“phone:”的行

*ex2-3-21

data _NULL_;

infile 'e:\sasdt\phonebk' truncover scanover;

input @'phone:' phone $32.;

put phone=;

run;

程序运行结果见图2-29所示。

spacer.gif

2-29 scanover扫描电话号