2013-04-09 65 views
2

如何讀取多個特定數據集並將其附加到一個大數據集?如何讀取多個特定數據集並將其附加到一個大數據集?

比如我一個圖書館我有數據集的100S,但我只想要追加有_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; 
+0

只有以_du開頭的數據集? – 2013-04-09 13:09:58

+0

是的_du數據集 – Lorbat 2013-04-09 13:17:12

+0

我已經回答了。我在do循環中添加了一個額外的等號。 – Lorbat 2013-04-09 14:36:38

回答

1

下面是一些代碼,將讓你從一些特點給定庫中的所有數據集名(與_DU開始)。您可以通過各種方式使用最終的宏來追加數據集。

(根據您的評論)
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聲明和使用您的計數的宏變種的標籤宏 數量縮小你的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; 
+0

PROC SQL NOPRINT; SELECT memname INTO:tab1-:tab103 FROM sashelp.vtable where memname like'_DU%'; SELECT count(*)INTO:obs FROM sashelp.vtable 其中memname像'_DU%'; QUIT; %宏橡膠; %i = 1%to i = &obs; proc append base = tot_comb data = && tab&i force; 跑; %end; %修復; %橡膠; – Lorbat 2013-04-09 13:39:21

+0

我已經完成了上面,但它不工作:(對不起,更好的看法: – Lorbat 2013-04-09 13:40:37

+0

如果上述不起作用,讓我知道錯誤,我會嘗試修復它 – 2013-04-09 14:45:57

5

PR OC APPEND在這種情況下實際上可能不會更快,或者至少不會更快就足以證明這一點,而不僅僅是寫一個datastep。

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。

相關問題