所以我有数百个变量,其中一些标有公共前缀" P0 - "。我没有手动从每个标签中删除这个前缀,而是尝试了各种SQL和宏函数而没有任何运气(我在新手上谈到了SQL)。任何帮助产生正确的语法都将受到高度赞赏!
语法失败:
proc sql noprint;
select catx(' ', label,'=',tranwrd(label,'P0 - ',''))
into :rcode separated by ' '
from dictionary.columns
where libname='WORK' and memname='DSET'
;
quit ;
%put &rcode ;
proc datasets library=work ;
modify dset ;
attrib _all_ label= &rcode;
run;
答案 0 :(得分:3)
您沿着正确的方向行驶,但代码中存在一些错误。首先,您需要将标签分配给列,而不是重命名标签。在dictionary.columns
这是name
变量(即宏应存储name = new_label
而不是label = new_label
)。
其次,您不需要attrib
中的关键字all
和proc datasets
。在数据步骤中使用attrib
来分配属性,并且在要将所有变量应用于同一标签的地方使用all
,最常见的是将它们全部设置为缺失。正确的语法(一旦您放入modify
语句)是label column1 = label1 column2 = label2
等。
尝试使用以下代码,虽然我还没有对其进行全面测试,但这应该可行。我在第一步中为where
子句添加了另一个声明,只包含标签以' PO - '开头的列,因为它看起来像你不是想要改变任何其他人。
proc sql noprint;
select
catx(' ', name,'=',tranwrd(label,'P0 - ',''))
into:
rcode separated by ' '
from
dictionary.columns
where
libname='WORK'
and
memname='DSET'
and
label eqt 'P0 - ';
quit ;
%put &rcode ;
proc datasets library=work ;
modify dset ;
label &rcode;
quit;
答案 1 :(得分:0)
我修改了你的代码,它适用于模拟数据。标签值应封装在括号中。我使用了column_name =" new label"在proc数据集中。
data DSET;
length A B C 3;
label
A = 'P0 - A'
B = 'P0 - B'
C = 'P0 - C'
;
run;
proc sql noprint;
select cat(strip(name), '=', '"', strip(tranwrd(label, 'P0 - ','')), '"')
into: rcode separated by ' '
from dictionary.columns where libname='WORK' and memname='DSET';
quit;
%put &rcode;
proc datasets library=work;
modify dset;
label
&rcode
;
run;