SAS' DATA STEP内部逻辑

SAS data step 包含两个阶段,编译和执行阶段,具体流程如下:
SAS' DATA STEP内部逻辑_第1张图片

一般来讲,SAS DATA Step处理的第一阶段是编译阶段,主要执行以下任务:
1.自动将SAS语句转换为稍后要执行的机器代码
2. 标识变量的类型以及长度
3. 确定后续的引用是否需要对变量进行类型转化
4. 若存在外部的input语句,则创建输入缓冲区
5. 创建程序数据向量(PDV)
6. 创建数据集和变量的描述性信息
7. 执行语句,但仅限于编译;给编译器如何开始提供相应的信息:DROP,KEEP,RENAME,RETAIN,WHERE,LABEL,LENGTH,FORMAT,ARRAY,BY,ATTRIB
8. 创建自动变量:N,ERROR,END=,IN=,FIRST,LAST,POINT=
第二阶段是执行阶段:
1.从data语句开始,并将_N_变量设置为1(每第二代一次DATA步,_N_加1)。
2. 在PDV中将变量值设置为缺失
3. 使用Input 语句将数据记录读入缓冲区(如果读取原始文件)
4. 使用以下语句之一从SAS数据集读取SAS观察结果:set,merge,modify,update
5. 执行data步内的语句
6. 将观测写入OUTPUT 的数据集(data null 除外)
7. 返回至data 语句
8. 每次迭代都会重复所有操作,直到达到输入文件的末尾
9. 如果DATA Step 不包含输入记录的读取,则默认情况下仅执行一次。
10.上述的默认执行顺序可以通过IF-THEN-ELSE 改变

SAS参考教程中将PDV定义为:“PDV是内存中用来创建数据集的逻辑区域,每次只涉及一条观测值。当程序执行时,SAS从输入缓存区中读入数值或通过执行SAS语句创建数值。数据值赋给PDV中一个合适的变量。SAS将该数值作为一条观测值写入SAS数据集。”

例:

data example1;
put "after compile before execution:"_all_;
x = "hello";
y = "world";
n = 5;
m = n * 2;
put "at end of execution:" _all_;
run;

编译阶段创建的PDV 如下:

x y n m _N_ ERROR
. . 1 0

在data 步结束后,PDV如下:

x y n m _N_ ERROR
hello world 5 10 1 0

只有一条记录输出道example1 数据集中,N,_ERROR_为临时变量,在输出时设置为MISSING.

你可能感兴趣的:(SAS,DATA,STEP,PDV,SAS,运行逻辑)