infile 指明原始数据的存放路径,从外部文件读入数据,必须出现在input语句之前。 语法:
infile "文件(名)位置路径" <options>;
options: DLM(delimiter)= dsd firstobs = obs= missover truncover pad lrecl = flowover
DLM即delimiter分隔符分离变量,默认状态下是以空格作为分隔符,可指定如DLM=',',如果数据集中存在多个分隔符也同时可指定多个分隔符,如DLM=',;'。dlm只能对单个字符作为分隔符分割,如果需要对字符串进行分割的话,需要做一些转换,如以ab这个字符串作为分隔符,则 dlm="*"; var=tranwrd(var,"ab","*");*为转换后分割符。
dsd 有两个功能:(1)如果变量中连续出现两个分割符delimiter,则视其为缺失数据,以.填补变量值。dsd默认的分隔符delimiter为, 如果数据集中的分隔符不是逗号,则需要dlm定义delimiter。
(2)可以忽略数字变量和字符串引号(单双引号)内的delimiter,如1,343读入SAS之后为1343,字符串"how,are,you"将被保留。
firstobs 开始读取数据行,如果文件中包含变量名,第二行为数据则firstobs=2 (为什么把变量名读进去作为变量名?)
obs 需要读取到第几行数据,针对大文件测试时常用。
missover sas默认flowover,为防止正在读取的行变量个数不满足时自动跳到下一行读取下一行的数据来填补当前行的变量可用missover。missover总是在行的最后显示缺失值。比如 23,34,,34,45,34
45,45,34,23,23,54
不使用missover的情况下,先读满第一行变量:23,34,34,45,34,45,第三个变量的缺失值被第四个变量的34填补,类推,第二行的45放到第一行的第六个变量里面。使用missover则:23,34,34,45,34,, 最后一个变量缺失,不自动读取下一行变量。
dsd 与missover的主要区别在于dsd遇到连续出现两个分割符delimiter,则视其为缺失数据,有可能出现读取下一行数据的情况,即遇到换行符不会停止。missover按顺序补充变量,空值的以.填补,直到遇到换行符就停止(结束改行数据读入)。
truncover 针对列输入时,如果一行最后读入的数值仍然不能满足变量需要的长度(比如读入变量为2个字符的,但该变量要求的长度为5-8个字符,正常情况下会放弃该变量,读取下一个变量知道满足条件),不会将变量缺失,而是将读入的值赋给改行最后的变量
pad 将数据行的后面部分填上空格,这样就使得数据行变长,不致于让input指针在读取短数据行时到达数据行结尾从而跳行。Pad不会抑制flowover的作用,它会将数据后面的空白位置填上空格,空格的长度由lrecl=n决定,默认n为256,当然可以在infile选项中修改n的大小。(看不懂,备用,这个解析摘抄自https://bbs.pinggu.org/thread-2145861-1-1.html)。
lrecl= sas读入每条观测大小是有限制的,默认256字节,当一条观测大于256字节时,超出的数据将不会读入dataline,超出的数据将会以.填补,lrecl可规定读入观测大小。