(4)如果数据行本身变长,也就是说数据行参差不齐,其中字符型变量又包含空 格字符。此时我们需要使用 SAS 提供的列指针来明确指定每一个数据行中变量读取的起 止位置,从而正确地截取变长的字符串。如下代码对字符型 NAME 变量明确指示从数 据行前 15 个字节中读取值,而对字符型 SEX 变量则没有指定列指针,默认读取前一 个变量之后到下一个变量之前之间的字符。这种方式一般用于表单化的数据读取(见 程序 2-20),生成的结果如图2-10 所示。
程序2-20 变长数据-按位置读取
data myclass;
input Name $1-15Sex $ Age Height Weight;
datalines;
Alfred Liu M 14 112.5 69
Alice Wang F 13 84 56.5
Barbara Deng F 13 98 65.3
;
图2-10 读取变长数据
(5)如果在一个数据行包括多个观测,数据呈锯齿状。我们该如何读取呢?SAS
SAS技术内幕:从程序员到数据科学家 在INPUT 语句上设计了一个特殊选项@@,用于告诉SAS 从数据行完整读取一个观测 后不要马上读取下一个数据行,而是继续从当前的数据缓冲区中继续读取数据填充观测。 这种灵活设计为读取各种复杂格式的数据,节省 SAS 代码内嵌数据行数非常有用。比如 下面的代码依然可以读取数据行中的锯齿状数据(见程序 2-21)。 程序2-21 忽略原始数据格式从缓冲区连续读取 data myclass; input Name $ Sex $ Age Height Weight @@; datalines; Alfred M 14 112.5 69 Alice F 13 84 56.5 Barbara F 13 98 65.3 ; (6)如果数据集的一个观测来自多行文本,此时需要联合游标控制符# 和@ 来读 取数据,它们分别表示对应数据行和列的偏移位置。此时,input 语句有若干参数可指定 用来接收执行过程中所读取的文件指针信息。下面的代码中数据行格式比较混乱,我们 需要一次读取3 行文本才能获得一个观测的完整数据(见程序 2-22)。 程序2-22 利用游标控制符读取跨行数据 data mydata; infile datalines line=LN col=COL; input name $ 1-10#2 @3 Sex $ /*从第2行第三列读取一个字符串变量 Sex */ #3 Age Weight Height; /*从第3行读取三个数值变量 */ datalines; Alfred M 14 112.5 69 Alice F 13 84 56.5 Barbara F 13 98 65.3 ;