2.3.4INFILE语句
作用是在数据步中指出用INPUT语句读取的外部数据文件。
1. 语法
INFILE file-specification ;
INFILE DBMS-specifications;
1)语句参数:
(1)file-specification 确定输入数据的记录源,这是一个外部文件或流内的数据。文件规格可以是这些形式:
① 外部文件指定外部文件的物理名称,即操作环境访问文件使用的名称。
②FileRef指定一个外部文件的文件逻辑名。
必须用FILENAME语句将文件逻辑名与外部文件的文件名联系起来。
要求:你必须与文件名的外部文件中语句的FileRef,文件名的功能,或适当的操作环境的命令。
③ Datalines | datalines4
指定输入数据步中紧跟在datalines或datalines4后面的数据。这允许你使用infile语句选项来控制用INPUT语句读取的数据行。
2)可选项
(1)COLUMN=变量 (别名:col =)
SAS将输入指针定位在当前列的位置。COLUMN=变量不写入数据集。
(2)DELIMITER=分隔符分隔符(别名: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选项。
(3)DSD(分隔符的敏感数据)
指定当数据值用引号括起来,值被视为字符数据时的定界符。当你使用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;
分隔符或a或b,运行结果见图2-23所示。
图2-23 用DELIMITER=选项读ab作分隔符的数据
如果省略DSD,字符a,b,aa,ab,bb或ba作为分隔符,没有缺失值分配给变量。如例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。
(6)expandtabs | noexpandtabs
指定是否要扩大制表符的标准为8-列的间隔设置,开始在第9列。默认值:noexpandtabs
提示:当你读包含你的操作环境的制表符的数据时,expandtabs是有用的。
(7)FILENAME=变量
命名一个变量,SAS设置为当前打开的输入文件的物理名称。像自动变量一样,变量不写入数据集。
提示:使用LENGTH语句语句使变量长度足够长,以便包含文件名的值。
(8)filevar =变量
命名一个变量,当infile语句关闭当前输入文件并打开一个新的文件时,该变量值发生变化,filevar变量包含有物理文件名的字符串。下一个INPUT语句执行时,它从filevar =变量指定的新文件读取。像自动变量一样,这个变量不写入数据集。
提示:使用filevar =动态改变当前打开的输入文件为新的物理文件。
(9)N =可用行数
指定输入指针一次能读的行数。
在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_。
(11)missover
如果在当前输入行中没有找到INPUT语句中所有变量的值,或者数据长度短于INPUT语句对该字段格式要求的长度时,IPUT语句会继续读下一个输入数据记录。这是输入语句的默认行为。使用missover能防止input语句从一个新的行读入数据记录,当INPUT语句到达当前输入数据记录结束时,没有被赋予任何值的变量取缺失值。
例2-3-18 一个外部文件mis.txt包含可变长度记录,有些记录还缺项,内容如下:
1 1
2 22
3 333
4
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选项读数据
truncover和missover选项的作用部分相似。这两个选项都能使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扫描电话号
阅读(5393) | 评论(0) | 转发(0) |