SAS:创建一个宏,为数据集中的变量添加后缀

SAS:创建一个宏,为数据集中的变量添加后缀,sas,Sas,我想创建一个宏,为数据集中的变量名添加后缀。下面是我的代码: %macro add_suffix(library=,dataset=,suffix=); proc sql noprint; select cat(name, ' = ', cats('&suffix.',name )) into :rename_list separated by ' ' from dictionary.columns where libname = '&li

我想创建一个宏,为数据集中的变量名添加后缀。下面是我的代码:

%macro add_suffix(library=,dataset=,suffix=);
    proc sql noprint;
        select cat(name, ' = ', cats('&suffix.',name )) into :rename_list separated by ' ' from
        dictionary.columns where libname = '&library.' and memname= '&dataset.';
    quit;

    proc datasets library=&library nolist nodetails;
        modify &dataset;
        rename &rename_list;
    run;

    quit;

%mend;
%add_suffix(library=OUTPUT,dataset=CA_SPREADS,suffix=CA);
它给出了错误消息:

NOTE: No rows were selected.
NOTE: PROCEDURE SQL used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


WARNING: Apparent symbolic reference RENAME_LIST not resolved.
NOTE: Line generated by the invoked macro "ADD_SUFFIX".
2                                                 rename &rename_list;     run;
                                                         -
                                                         22
                                                         76
NOTE: Enter RUN; to continue or QUIT; to end the procedure.

ERROR 22-322: Expecting a name.

ERROR 76-322: Syntax error, statement will be ignored.
如果我将库和数据集名称放在引号中,则它适用于第一个块,即向字符串重命名列表添加值,但不适用于proc数据集步骤

  • 您的宏变量未被解析,因为您将它们用单引号
    而不是双引号
  • 宏的libname和memname参数应该大写,因为它们在
    dictionary.columns
    中总是大写的
  • 您的宏变量未被解析,因为您将它们用单引号
    而不是双引号
  • 宏的libname和memname参数应该大写,因为它们在
    dictionary.columns
    中总是大写的

  • %
    &
    这样的宏触发器在单引号内不受尊重。这就是为什么您的SQL查询没有任何点击率。没有将
    &
    作为第一个字符的库名称

    它看起来能正常工作的原因是当您在SQL语句中使用它时

    catx('=',name,cats('&prefix.',name))
    
    然后你会得到一条像

    age=&prefix.age
    
    这实际上是可行的,因为当您运行
    RENAME
    语句时,对宏变量
    PREFIX
    的引用将被解析

    你应该用双引号代替

    %macro change_names(library=,dataset=,prefix=,suffix=);
    %local rename_list;
    proc sql noprint;
      select catx('=',name,cats("&prefix",name,"&suffix"))
        into :rename_list separated by ' ' 
      from dictionary.columns
      where libname = %upcase("&library")
        and memname = %upcase("&dataset")
      ;
    quit;
    
    %if (&sqlobs) %then %do;
    proc datasets library=&library nolist nodetails;
      modify &dataset;
        rename &rename_list;
      run;
    quit;
    %end;
    %else %put WARNING: Did not find any variables for &library..&dataset..;
    %mend change_names;
    
    %change_names(library=OUTPUT,dataset=CA_SPREADS,prefix=CA);
    

    %
    &
    这样的宏触发器在单引号内不受尊重。这就是为什么您的SQL查询没有任何点击率。没有将
    &
    作为第一个字符的库名称

    它看起来能正常工作的原因是当您在SQL语句中使用它时

    catx('=',name,cats('&prefix.',name))
    
    然后你会得到一条像

    age=&prefix.age
    
    这实际上是可行的,因为当您运行
    RENAME
    语句时,对宏变量
    PREFIX
    的引用将被解析

    你应该用双引号代替

    %macro change_names(library=,dataset=,prefix=,suffix=);
    %local rename_list;
    proc sql noprint;
      select catx('=',name,cats("&prefix",name,"&suffix"))
        into :rename_list separated by ' ' 
      from dictionary.columns
      where libname = %upcase("&library")
        and memname = %upcase("&dataset")
      ;
    quit;
    
    %if (&sqlobs) %then %do;
    proc datasets library=&library nolist nodetails;
      modify &dataset;
        rename &rename_list;
      run;
    quit;
    %end;
    %else %put WARNING: Did not find any variables for &library..&dataset..;
    %mend change_names;
    
    %change_names(library=OUTPUT,dataset=CA_SPREADS,prefix=CA);
    

    测试和工作。更长但可能更适合初学者的方法。输入数据集名称和要添加的后缀

    示例:%add_后缀(订单,_旧);/*将向所有变量添加_旧后缀*/

    %macro Add_Suffix(Dataset, suffix);
        proc contents noprint
            data=work.&dataset out=sjm_tmp(keep=NAME);
        run;
    
        data sjm_tmp2;
            set sjm_tmp;
            foobar=cats(name, '=',NAME,'&suffix.');
        run;
    
        proc sql noprint;
            select foobar into :sjm_list separated by ' ' from sjm_tmp2;
        quit;
    
        proc datasets library = work nolist;
           modify &dataset;
           rename &sjm_list;
        quit;
    
        proc datasets library=work noprint;  
           delete sjm_tmp sjm_tmp2 ;  
        run;
    %mend Add_Suffix;
    

    测试和工作。更长但可能更适合初学者的方法。输入数据集名称和要添加的后缀

    示例:%add_后缀(订单,_旧);/*将向所有变量添加_旧后缀*/

    %macro Add_Suffix(Dataset, suffix);
        proc contents noprint
            data=work.&dataset out=sjm_tmp(keep=NAME);
        run;
    
        data sjm_tmp2;
            set sjm_tmp;
            foobar=cats(name, '=',NAME,'&suffix.');
        run;
    
        proc sql noprint;
            select foobar into :sjm_list separated by ' ' from sjm_tmp2;
        quit;
    
        proc datasets library = work nolist;
           modify &dataset;
           rename &sjm_list;
        quit;
    
        proc datasets library=work noprint;  
           delete sjm_tmp sjm_tmp2 ;  
        run;
    %mend Add_Suffix;
    

    看起来您正在尝试为名称添加前缀。此处未考虑前缀,但您需要确保名称长度不超过32个字符。对于重命名部分,我自己更喜欢CATX,它更容易阅读。看起来您正在尝试为名称添加前缀。此处未考虑前缀,但您需要确保名称长度不超过32个字符。对于重命名部分,我自己更喜欢CATX,它更容易阅读。