2

您如何读取多个特定数据集并附加到一个大数据集?

例如,我在一个库中拥有 100 个数据集,但我只想附加具有 _du1、_du2 的数据集

格式和列名相同

我的刺没用:

PROC SQL NOPRINT;
SELECT memname INTO :tab1-:tab103 FROM sashelp.vtable
where memname like '_DU%';
SELECT count(*) INTO :obs FROM sashelp.vtable
where memname like '_DU%';
QUIT;

%macro rubber;
%do i=1 %to i=&obs;
proc append base=tot_comb data=&&tab&i force;
run;
%end;
%mend;

%rubber;
4

2 回答 2

5

在这种情况下,PROC APPEND 实际上可能不会更快,或者至少不会快到足以证明这样做的合理性,而不是仅仅编写一个数据步。

data tot_comb;
set work._DU:; *or your libname;
run;

如果您使用的是 SAS 9.2 或更高版本,这将起作用。如果您使用的是 9.1 或更早版本,则需要执行一个 proc sql 步骤,例如

proc sql;
select memname into :namelist separated by ' '
  from dictionary.columns
  where libname='WORK' /* or your libname */
  and memname eqt '_DU';
quit;
*eqt is like starts with;
data tot_comb;
set &namelist;
run;

这只需要一次写入,我不确定它是否会比对 PROC APPEND 的多次调用慢得多。

于 2013-04-09T15:04:54.153 回答
1

下面是一些代码,可以从给定库中获取所有具有某些特征的数据集名称(以 _DU 开头)。您可以通过多种方式使用 final 宏来附加数据集。

Data _DU1;
 var="One";
Run;
Data _DU2;
 var="Two";
Run;

PROC SQL;
 create table main as
 SELECT *
 FROM DICTIONARY.COLUMNS
 WHERE UPCASE(LIBNAME)="WORK" AND
 UPCASE(MEMNAME) like '_DU%';

 Select memname
 into :dsn separated by ' '
 from main;
QUIT;

%Put &dsn;

编辑(根据您的评论)

我添加了一些 UPCASE 语句并将您的 count 宏 var 用于选项卡宏的数量缩小 where 语句应该使您的代码更高效

试试这个(一些代码未经测试):

 PROC SQL NOPRINT; 
  SELECT count(*) 
  INTO :obs 
  FROM sashelp.vtable 
  where UPCASE(LIBNAME)="<YOUR LIB IN UPCASE>" AND
        upcase(memname) like '_DU%'; 
 %Let obs=&obs;
  SELECT memname 
  INTO :tab1-:tab&obs 
  FROM sashelp.vtable 
  where UPCASE(LIBNAME)="<YOUR LIB IN UPCASE>" AND
       upcase(memname) like '_DU%'; 

 QUIT; 

 %macro rubber; 
  %do i=1 %to &obs; 
   proc append base=tot_comb data=&&tab&i force; run; 
  %end; 
 %mend; 
 %rubber; 
于 2013-04-09T13:26:45.463 回答