我每个月都有6个月数据集,每个月都会添加一个新的数据集。我需要一个宏来自动将增量数据集附加到现有的数据集中。
(通过追加6个现有数据集创建)
等等,每个月都要继续前进。数据集按顺序有完全相同的变量,名称如下:
'completeextract8634.sas7bdat'
'completeextract8640.sas7bdat'诸若此类。有办法做到这一点吗?谢谢!
发布于 2018-07-12 11:24:50
一种方法可能是使用SET语句将数据与要用通配符(:)指定的堆栈进行堆栈。通配符也称为快捷命名或形式上的“数据集列表”。
示例数据步骤视图
DATA work.combined / view=work.combined;
SET EXTRACT.completeextract: ;
RUN;Proc APPEND在这方面也是完美的。请参阅文档讨论使用附加过程对数据集进行协调
示例宏
注意:这个示例假设您的“系统”是通过允许将它们移动到不同的库来管理附加的摘录的。如果文件未被移动,且增长表没有唯一索引,则可能会追加一次以上的提取。
LIBNAME EXTRACT '<folder containing extract data sets>';
LIBNAME HISTORY '<folder containing the permanent and growing data set>';
LIBNAME DONE '<folder where extract data sets can be moved to>';
%macro appendFromLib(base=, fromLIb=, dataNamesLike=, doneLib=);
proc sql;
%if %sysfunc(exist(work.dataNames)) %then %do;
drop table dataNames;
%end;
create table dataNames as select
memname from dictionary.tables
where libname = "%upcase(&fromLib)"
and memname like %upcase(&dataNamesLike)
;
data _null_;
set dataNames;
appendStep = "PROC APPEND BASE=&BASE DATA=&FROMLIB.." || trim(memname) || ";" ;
call execute ('%NRSTR(' || trim(appendStep) || ')');
maintenanceStep = "PROC DATASETS NOLIST; COPY IN=&FROMLIB OUT=&DONELIB MOVE; SELECT " || trim(memname) || '; QUIT;' ;
call execute ('%NRSTR(' || trim(maintenanceStep) || ')');
run;
%let syslast = &BASE;
%mend;
%appendFromLib (
base=HISTORY.COMPLETE_ALL
fromLib=EXTRACT,
dataNamesLike='completeextract%',
doneLib=DONE
);对Proc追加的进一步web搜索可能会找到其他示例,可能还会找到一些包含此功能的现有宏库。
发布于 2018-08-16 12:53:05
作为对评论的回应
可以更改宏定义以指定默认值(如dataNamesLike=% ),然后添加新的参数dataNamesWhere=1。
附加参数可以在dataNames查询中使用,以便也具有and &dataNamesWhere。您将负责提出一个足够健壮的where子句来执行您想要的选择。
您还可以添加一个参数dataNames=,该参数包含要以追加/维护方式处理的预先生成的数据集列表。如果使用此参数,则将绕过默认的发现步骤。
备用代码示例
* make my own list of data sets to process;
%let names = ;
proc sql outobs=3;
create table work.dataNamesX as
select memname
from dictionary.tables
where libname = "EXTRACT"
and memname like "COMPLETEEXTRACT%"
order by
memname descending
;
%appendFromLib(base=here.biggun, fromLib=EXTRACT, dataNames=work.dataNamesX, doneLib=there);更新宏
%macro appendFromLib(base=, fromLIb=, dataNamesLike=%, doneLib=, dataNames=);
proc sql;
%if %length (&dataNames) = 0 %then %do;
%let dataNames = work.dataNames;
%if %sysfunc(exist(&dataNames)) %then %do;
drop table &dataNames;
%end;
create table &dataNames as select
memname from dictionary.tables
where libname = "%upcase(&fromLib)"
and memname like %upcase(&dataNamesLike)
;
%end;
data _null_;
set dataNames;
appendStep = "PROC APPEND BASE=&BASE DATA=&FROMLIB.." || trim(memname) || ";" ;
call execute ('%NRSTR(' || trim(appendStep) || ')');
maintenanceStep = "PROC DATASETS NOLIST; COPY IN=&FROMLIB OUT=&DONELIB MOVE; SELECT " || trim(memname) || '; QUIT;' ;
call execute ('%NRSTR(' || trim(maintenanceStep) || ')');
run;
%let syslast = &BASE;
%mend;https://stackoverflow.com/questions/51303519
复制相似问题