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数据集步骤
“
而不是双引号”
dictionary.columns
中总是大写的“
而不是双引号”
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,它更容易阅读。