表名的 SAS 宏和数组

SAS Macro and arrays for tables names

我是 SAS 的新手,我正在查看这段代码:

    libname FINAL 'C:\PERM';
    %LET PERM_DB = C:\PERM_DB.ACCDB;
    %LET PASS   = 1234;
    %LET EXTRA1 = _A;


            %MACRO PERM(tablename);

            PROC IMPORT OUT= FINAL.&tablename&EXTRA1 DATATABLE= "&tableACCESS&EXTRA1" 
            DBMS=ACCESS REPLACE;
            DATABASE="&PERM_DB"; 
            DBPWD="&PASS"; SCANMEMO=YES; USEDATE=NO; SCANTIME=YES; RUN;

            %MEND PERM;

            %PERM(table1);
            %PERM(table2);
            %PERM(table3);
            %PERM(table4);
            %PERM(table5);
            %PERM(table6);
            %PERM(table7);
            %PERM(table8);
            %PERM(table9);
            %PERM(table10);

我在考虑创建一个数组和一个循环来调用它,而不是重复多次宏。

    Data test;
    array perm{*} table1, table2,table3,table4,table5,table6,table7,table8,table9,table10;

    max = DIM(perm);

    DO i=1 to max;
    %PERM(perm(i));
    END;
run;

但是不行, 我在日志中收到此错误:

> > 1      FINAL.perm(1)_A
> >                   -
> >                   22
> >                     --
> >                     22
> >                     202  ERROR 22-7: Invalid option name 1.
>  
> > ERROR 22-322: Syntax error, expecting one of the following: ;,  DATAFILE, DATATABLE, DBMS, DEBUG,
>                FILE, OUT, REPLACE, TABLE, _DEBUG_.
>  
> > ERROR 202-322: The option or parameter is not recognized and will be  ignored.

我正在用数组中的值 1 对其进行测试。

任何帮助或建议都会很棒。

输出应该是这样的:

FINAL.table1_A

但我得到

FINAL.perm(1)_A

谢谢。

有几种方法可以解决这个问题。例如,搜索 "Data driven programming"。我将展示两个:我喜欢的一个,以及很多人会推荐的一个。

首先,流行的解决方案是做一个宏循环。正确地,我会写一个带有最小和最大参数的宏,如下所示:

%macro perm(tablename);
  %put &tablename;
%mend perm;

%macro import_data(min=1,max=);
  %do _i = &min. %to &max.;
    %perm(table&_i.);
  %end;
%mend import_data;

%import_data(min=1,max=10);

显然你的真实 %perm 不是我的例子。它循环从 &min.&max.%perm 调用。

其次,我认为真正的数据驱动在很多情况下是最好的。这假设你有一个 table 某处,每个 table 一行你想要导入 - 尽管你同样可以用这个来做上面的解决方案。

假设您有一个 excel 文件,其中有一些您要导入的 sheet。您可以使用 dictionary.tables 获取这些 sheet 的列表并自动导入每个 sheet.

libname imports excel "c:\temp\test_import.xlsx";

proc sql;
  select cats('%perm(',memname,')')
    into :calllist separated by ' '
    from dictionary.tables
    where libname='IMPORTS';
quit;

&calllist.

(假设 %perm 知道如何使用 sheet 名称导入数据。)如果您从其他来源导入,您可能可以访问类似的元数据 - 通过 SAS例如,通过 dictionary.tables 或 Oracle 中的本地元数据连接。