【发布时间】:2020-08-22 09:10:30
【问题描述】:
我有一些旧的 SAS 代码要转换成 python。
部分代码有效地做到了这一点:
data A (index=(key1=(record_id, record_version)));
set table.xxx (where = ...)
run;
data B;
set table.yyy (where = ...)
set A key=key1/unique;
if _ERROR_ = 1 then do;
valueA = "";
_ERROR_ = 0;
end;
run;
我已阅读 SET and UNIQUE 声明的文档,其中说:
默认情况下,SET 仅在 KEY= 值更改时才在索引顶部开始搜索。
如果 KEY= 值在 SET 语句的连续执行中没有改变,则搜索从最近检索到的观察开始。换句话说,当出现连续重复的 KEY= 值时,SET 语句会尝试与正在读取的数据集中的重复索引值进行一对一匹配。如果指定的连续重复 KEY= 值多于正在读取的数据集中存在的重复值,则将多余的重复值视为未找到。
当 KEY= 是唯一值时,只有第一次尝试使用该键值读取观察结果才会成功;随后尝试使用该键值读取观察结果失败。 IORC 变量返回一个对应于 SYSRC 自动调用宏的助记符 _DSENOM 的值。如果添加 /UNIQUE 选项,则后续尝试读取具有唯一 KEY= 值的观察会成功。 IORC 变量返回 0。
嗯,“随后尝试使用该键值读取观察结果失败。”。失败怎么办?
所以实际上,给定 A 和 B 是:
A record_id record_version valueA B record_id record_version valueB
1 1 A11 1 1 B10
1 1 A12 1 2 B20
1 2 A22
1 3 A33
我的输出肯定会包括这些行:
record_id record_version valueA valueB
1 1 A11 B10
1 2 A22 B20
我不明白if _ERROR_ 语句的作用。
我明白了吗?
record_id record_version valueA valueB
1 1 B10
还是这个?
record_id record_version valueA valueB
1 1 A12 B10
我明白了吗?
record_id record_version valueA valueB
1 3 A33 null
还是这个?
record_id record_version valueA valueB
1 3 null
错误语句处理的边缘情况是什么?
【问题讨论】:
标签: sas