全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2176 1
2009-12-02
有兴趣的请笑纳。特别是做ETL的朋友。

LIBNAME TEST "D:\TESTDATA";

%LET RPT=RPT_TEMP;

proc sql;
    create table test.change as
    select
    memname
    from dictionary.tables
    where libname eq "TEST";
quit;

%MACRO CHANGE();
    %LET DSID=%SYSFUNC(OPEN(test.change));
    %IF &DSID GT 0 %THEN %DO;
    %LET NOBS=%SYSFUNC(ATTRN(&DSID,NOBS));
    %DO I=1 %TO &NOBS;
        %LET RC=%SYSFUNC(FETCHOBS(&DSID,&I));
        %LET VARNUME=%SYSFUNC(VARNUM(&DSID,MEMNAME));
        %LET TABLE=%SYSFUNC(GETVARC(&DSID,&VARNUME));
        PROC DATASETS LIB=TEST;
        CHANGE &TABLE=&RPT._T&I.;
        QUIT;
    %END;
    %LET DSID=%SYSFUNC(CLOSE(&DSID));
   %END;
%MEND CHANGE;

%CHANGE;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2009-12-3 12:28:16
nkwilling 发表于 2009-12-2 09:21
有兴趣的请笑纳。特别是做ETL的朋友。

LIBNAME TEST "D:\TESTDATA";

%LET RPT=RPT_TEMP;

proc sql;
    create table test.change as
    select
    memname
    from dictionary.tables
    where libname eq "TEST";
quit;

%MACRO CHANGE();
    %LET DSID=%SYSFUNC(OPEN(test.change));
    %IF &DSID GT 0 %THEN %DO;
    %LET NOBS=%SYSFUNC(ATTRN(&DSID,NOBS));
    %DO I=1 %TO &NOBS;
        %LET RC=%SYSFUNC(FETCHOBS(&DSID,&I));
        %LET VARNUME=%SYSFUNC(VARNUM(&DSID,MEMNAME));
        %LET TABLE=%SYSFUNC(GETVARC(&DSID,&VARNUME));
        PROC DATASETS LIB=TEST;
        CHANGE &TABLE=&RPT._T&I.;
        QUIT;
    %END;
    %LET DSID=%SYSFUNC(CLOSE(&DSID));
   %END;
%MEND CHANGE;

%CHANGE;
Here are general comments to who would like to learn SAS and SAS macro.

It is always good idea to avoid macro if there are other simple ways. Good macro programming needs a lot good think , such as , dynamic, robust, and efficent. After all SAS macro is simply a text generator. The necessary condistion for a good macro programmer is a good SAS(DATA STEP/SQL) BASE programmer. To learn how to walk is before how to run.

This will be much simpler and more readable.

data t1 t2 t3;
  do i = 1 to 1e1;
  end;
run;

%LET RPT=RPT_TEMP;

proc sql noprint;
    select cats(memname,"=&RPT._",memname) into: rdsnlist separated by ' '
    from dictionary.tables
    where libname eq "WORK";
quit;

PROC DATASETS LIB=work;
        CHANGE &rdsnlist
        ;
RUN;
QUIT;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群