首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAS将每月增量数据集附加到一个数据集中

SAS将每月增量数据集附加到一个数据集中
EN

Stack Overflow用户
提问于 2018-07-12 10:39:36
回答 2查看 1.1K关注 0票数 1

我每个月都有6个月数据集,每个月都会添加一个新的数据集。我需要一个宏来自动将增量数据集附加到现有的数据集中。

(通过追加6个现有数据集创建)

等等,每个月都要继续前进。数据集按顺序有完全相同的变量,名称如下:

代码语言:javascript
复制
'completeextract8634.sas7bdat'
'completeextract8640.sas7bdat'

诸若此类。有办法做到这一点吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2018-07-12 11:24:50

一种方法可能是使用SET语句将数据与要用通配符(:)指定的堆栈进行堆栈。通配符也称为快捷命名或形式上的“数据集列表”

示例数据步骤视图

代码语言:javascript
复制
DATA work.combined / view=work.combined;
  SET EXTRACT.completeextract: ;
RUN;

Proc APPEND在这方面也是完美的。请参阅文档讨论使用附加过程对数据集进行协调

示例宏

注意:这个示例假设您的“系统”是通过允许将它们移动到不同的库来管理附加的摘录的。如果文件未被移动,且增长表没有唯一索引,则可能会追加一次以上的提取。

代码语言:javascript
复制
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搜索可能会找到其他示例,可能还会找到一些包含此功能的现有宏库。

票数 2
EN

Stack Overflow用户

发布于 2018-08-16 12:53:05

作为对评论的回应

可以更改宏定义以指定默认值(如dataNamesLike=% ),然后添加新的参数dataNamesWhere=1

附加参数可以在dataNames查询中使用,以便也具有and &dataNamesWhere。您将负责提出一个足够健壮的where子句来执行您想要的选择。

您还可以添加一个参数dataNames=,该参数包含要以追加/维护方式处理的预先生成的数据集列表。如果使用此参数,则将绕过默认的发现步骤。

备用代码示例

代码语言:javascript
复制
* 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);

更新宏

代码语言:javascript
复制
%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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51303519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档