SAS:如果存在则更新数据集,否则创建它
SAS: update dataset if it exists, else create it
我需要使用数据集 dt_new 更新数据集 mylib.dt_old,但我想先检查它是否确实存在,否则我会收到错误消息。如果它不存在,我只想创建一个数据集 mylib.dt_old 来存储 dt_new 中包含的信息。
我尝试了以下方法:
if (exist(mylib.dt_old))
then do;
data mylib.dt_old;
update mylib.dt_old dt_new;
by date var1 var2;
run;
end;
else do;
data mylib.dt_old; set dt_new;
run;
end;
但是当 mylib.dt_old 不存在时我得到了错误
ERROR: File MYLIB.DT_OLD.DATA does not exist.
并且 sas 继续实际执行 else 语句(创建 dt_old 复制 dt_new)。
相反,如果 dt_old 确实存在,我会得到
if (exist(mylib.dt_old))
--
180
ERROR 180-322: Statement is not valid or it is used out of proper order.
我做错了什么?
PS: 我是 SAS 初学者。
您尝试做的实际上符合 SAS 中的宏编程的条件,这有时被认为是一个 "advanced" 主题。
您使用的常规 if-then 控制逻辑是 SAS 认为的数据步代码,即它仅在数据步中有效。但是有一种"macro"语言看起来很相似,但是通过%
前缀来区分。修改后的代码可能如下所示:
%macro updater();
%if %sysfunc(exist(mylib.dt_old))
%then %do;
data mylib.dt_old;
update mylib.dt_old dt_new;
by date var1 var2;
run;
%end;
%else %do;
data mylib.dt_old;
set dt_new;
run;
%end;
%mend updater;
%updater()
虽然这个示例有点直截了当,但 SAS 宏语言经常违反直觉(至少对我而言)。如果您是初学者,最好在线查找和阅读 "into to SAS macros"。
我需要使用数据集 dt_new 更新数据集 mylib.dt_old,但我想先检查它是否确实存在,否则我会收到错误消息。如果它不存在,我只想创建一个数据集 mylib.dt_old 来存储 dt_new 中包含的信息。 我尝试了以下方法:
if (exist(mylib.dt_old))
then do;
data mylib.dt_old;
update mylib.dt_old dt_new;
by date var1 var2;
run;
end;
else do;
data mylib.dt_old; set dt_new;
run;
end;
但是当 mylib.dt_old 不存在时我得到了错误
ERROR: File MYLIB.DT_OLD.DATA does not exist.
并且 sas 继续实际执行 else 语句(创建 dt_old 复制 dt_new)。
相反,如果 dt_old 确实存在,我会得到
if (exist(mylib.dt_old))
--
180
ERROR 180-322: Statement is not valid or it is used out of proper order.
我做错了什么? PS: 我是 SAS 初学者。
您尝试做的实际上符合 SAS 中的宏编程的条件,这有时被认为是一个 "advanced" 主题。
您使用的常规 if-then 控制逻辑是 SAS 认为的数据步代码,即它仅在数据步中有效。但是有一种"macro"语言看起来很相似,但是通过%
前缀来区分。修改后的代码可能如下所示:
%macro updater();
%if %sysfunc(exist(mylib.dt_old))
%then %do;
data mylib.dt_old;
update mylib.dt_old dt_new;
by date var1 var2;
run;
%end;
%else %do;
data mylib.dt_old;
set dt_new;
run;
%end;
%mend updater;
%updater()
虽然这个示例有点直截了当,但 SAS 宏语言经常违反直觉(至少对我而言)。如果您是初学者,最好在线查找和阅读 "into to SAS macros"。