如何用下划线分隔两个宏变量数据集名称?

时间:2019-01-08 15:06:53

标签: sas identifier sas-macro

我正在尝试用下划线分隔由两个宏变量创建的数据集名称,但这给我%macro create_table一个错误。

%macro create_tables;
* NOTE THE DOUBLE AMPERSAND! *;
data &&_produto&i_&&_mes_char&j;

我尝试在第一个宏变量的末尾使用点,但未按预期工作。我该如何解决这种情况?

%macro create_tables;
    * NOTE THE DOUBLE AMPERSAND! *;
    data &&_produto&i_&&_mes_char&j;
        set aux_base_defaults;
        if fim_mes = &&_fim_mes&j and cod = &&_id_produto&i;
    run;
%mend create_tables;

*------------------------------------------*;
* DEFINE MACRO VARIABLES *;
*------------------------------------------*;
proc sql;

create table produtos_a_considerar as
select b.sigla, a.cod
    from (select distinct cod
                from aux_base_defaults
            group by cod) a
inner join ecl.referencia_produtos b on b.id_produto = a.cod;

quit;

data _null_;
    set produtos_a_considerar;
    call symput( '_produto' || left(trim(_N_)) , trim(sigla));
    call symput( '_id_produto' || left(trim(_N_)) , cod);
    call symput( '_obs_produto' , _N_ );
run;

data _null_;
    set dim_fim_mes;
    call symput( '_fim_mes' || left(trim(_N_)) , fim_mes );
    call symput( '_mes_char' || left(trim(_N_)) , substr(mes_char,1,7));
    call symput( '_obs_fim_mes' , _N_ );
run;

*-----------------------------------------*;
* SUBMIT EXAMPLE5 FOR EACH DATASET *;
*-----------------------------------------*;
%macro loop;
    %do i=1 %to &_obs_produto;  
        %do j=1 %to &_obs_fim_mes;
            %create_tables;
        %end;
    %end;
%mend loop;
%loop;

3 个答案:

答案 0 :(得分:1)

在这种情况下,您需要2个点-首先将循环变量与下划线分开,然后在解决第一个与号后,再将另一个变量从下划线中分离出来。

写一个最小的例子来验证这种事情是否可以按您期望的方式工作通常会很有帮助。例如

%let mvar1 = foo;
%let mvar2 = bar;

%let i = 1;
%let j = 2;

%put &&mvar&i.._&&mvar&j;

输出:

foo_bar

答案 1 :(得分:0)

您可能需要更多时间。本质上,宏处理器为完全解析宏变量引用而需要进行的每一遍操作都需要执行一次。

但是重组程序可能更容易,因此您不必担心。

# dict(zip(L1, L2 * 2))
dict(zip(L1, L2 + L2))
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}

答案 2 :(得分:0)

两个案例都很好!谢谢你们的帮助

%let mvar1 = foo;
    %let mvar2 = bar;

    %let i = 1;
    %let j = 2;

    %put &&mvar&i.._&&mvar&j;
    Output:

foo_bar

%local dsname ;
%let dsname = &&_produto&i
%let dsname = &dsname._&&_mes_char&j;
data &dsname ;
 ...