SAS是否有一种简单的方法可以将字符串转换为可用作列名的SAS安全名称?
即
Rob Penridge ----> Rob_Penridge
$*@'Blah@* ----> ____Blah__
我正在使用proc transpose
,然后想要在转置后使用重命名的列。
答案 0 :(得分:5)
proc transpose
, options validvarname=any;
将不加任何修改地使用这些名称
如果您想在之后使用列,可以使用NLITERAL函数构造可用于引用它们的命名文字:
options validvarname=any;
/* Create dataset and transpose it */
data zz;
var1 = "Rob Penridge";
var2 = 5;
output;
var1 = "$*@'Blah@*";
var2 = 100;
output;
run;
proc transpose
data = zz
out = zz_t;
id var1;
run;
/* Refer to the transposed columns in the dataset using NLITERAL */
data _null_;
set zz;
call symput(cats("name", _n_), nliteral(var1));
run;
data blah;
set zz_t;
&name1. = &name1. + 5;
&name2. = &name2. + 200;
run;
答案 1 :(得分:2)
可以尝试perl正则表达式函数。 因为对于列名,第一个字符不应该是数字,那么它就更复杂了。
data _null_;
name1 = "1$*@' Blah1@*";
name2 = prxchange("s/[^A-Za-z_]/_/",1,prxchange("s/[^A-Za-z_0-9]/_/",-1,name1));
put name2;
run;
答案 2 :(得分:2)
查看VALIDVARNAME系统选项。它可能允许您接受无效的SAS名称。
此外,NOTNAME功能可以帮助您找到无效字符。
答案 3 :(得分:1)
如何使用SAS的regular expression
功能?例如:
data names;
set name;
name_cleaned = prxchange('s/[^a-z0-9 ]/_/i', -1, name);
run;
这会将不是字母,数字或空格的任何内容转换为_
。您可以在9
之后将要允许的其他字符添加到列表中。请注意,某些字符是“特殊的”,并且必须以\
开头。
答案 4 :(得分:0)
您还可以使用转置中的IDLABEL
语句添加与原始值匹配的标签。然后使用VARLABEL
函数检索标签并以这种方式使用它们。