包含特殊字符的SAS变量列表
SAS List of variables containing special characters
我是 SAS 编程的新手,我正在尝试创建一个 old_variable 名称的列表,以便我可以使用它们(子集、重命名、空格等),但是变量名称很奇怪字符(#、括号、单引号、数字,随便你怎么说)。每个变量由“;”分隔并且源文件是csv格式。我需要对 44 个不同的文件执行此操作,每个文件大约有 199 个变量。
到目前为止,我已经尝试了一个创建变量列表的宏,但是,由于特殊字符,当我尝试使用宏 &vars 时代码失败。我已经检查了 SAS 论文 005-2013,但是我相信我不太确定如何在我的代码中使用这些函数。
如有任何见解或指示,我们将不胜感激。这是我到目前为止尝试过的代码:
1) 导入:
proc import datafile='file_oldname.csv'
dbms=csv
out= oldName
replace;
delimiter=',';
getnames=yes;
run;
2) 列出我的老名字;
* 包含旧变量名称的宏变量;
* 使用 Proc 内容和 Proc SQL;
proc contents data=oldName out=listOldName;
run;
options VALIDMEMNAME=EXTEND;
proc sql noprint;
select distinct(name) into:vars separated by " " from listOldName;
quit;
%put &vars;
&vars 包含变量列表,但是如果我尝试使用它,它会因为特殊字符而失败。
如何正确包装 &vars 以便可以使用带有特殊字符的变量名?我想用新名称进一步重命名它们。
非常感谢!
由于您的变量名包含特殊字符,需要以"name literal!"n
格式引用。
尝试:
options VALIDVARNAME=ANY;
proc sql noprint;
select distinct nliteral(name)
into:vars separated by ' '
from listOldName;
%put &=var;
documentation 中有关名称文字的更多信息。
编辑 - 正如@Tom, the nliteral function handily covers the conversion you require! Documentation for that is here.
所指出的
当 Proc IMPORT
运行时,它会创建变量名称符合导入时 VALIDVARNAME
设置的数据集。因此,一种替代方法是在 IMPORT 之前设置选项以确保 'clean' 变量名称,然后再将其重置。
%let setting = %sysfunc(getoption(VALIDVARNAME));
options validvarname=v7;
Proc IMPORT ... ;
...;
run;
options validvarname = &SETTING;
例子
filename have temp;
data _null_;
file have;
put 'Name,"Age","Date of Birth",School:First,Surprise!,-Feedback';
put 'Abel,0,Yesterday,Eastern Acacdemy,Balloons!,None';
run;
options validvarname=any;
proc import file=have replace out=have_any dbms=csv;
getnames=yes;
run;
options validvarname=v7;
proc import file=have replace out=have_v7 dbms=csv;
getnames=yes;
run;
options validvarname=any;
我是 SAS 编程的新手,我正在尝试创建一个 old_variable 名称的列表,以便我可以使用它们(子集、重命名、空格等),但是变量名称很奇怪字符(#、括号、单引号、数字,随便你怎么说)。每个变量由“;”分隔并且源文件是csv格式。我需要对 44 个不同的文件执行此操作,每个文件大约有 199 个变量。
到目前为止,我已经尝试了一个创建变量列表的宏,但是,由于特殊字符,当我尝试使用宏 &vars 时代码失败。我已经检查了 SAS 论文 005-2013,但是我相信我不太确定如何在我的代码中使用这些函数。
如有任何见解或指示,我们将不胜感激。这是我到目前为止尝试过的代码:
1) 导入:
proc import datafile='file_oldname.csv'
dbms=csv
out= oldName
replace;
delimiter=',';
getnames=yes;
run;
2) 列出我的老名字; * 包含旧变量名称的宏变量; * 使用 Proc 内容和 Proc SQL;
proc contents data=oldName out=listOldName;
run;
options VALIDMEMNAME=EXTEND;
proc sql noprint;
select distinct(name) into:vars separated by " " from listOldName;
quit;
%put &vars;
&vars 包含变量列表,但是如果我尝试使用它,它会因为特殊字符而失败。
如何正确包装 &vars 以便可以使用带有特殊字符的变量名?我想用新名称进一步重命名它们。
非常感谢!
由于您的变量名包含特殊字符,需要以"name literal!"n
格式引用。
尝试:
options VALIDVARNAME=ANY;
proc sql noprint;
select distinct nliteral(name)
into:vars separated by ' '
from listOldName;
%put &=var;
documentation 中有关名称文字的更多信息。
编辑 - 正如@Tom, the nliteral function handily covers the conversion you require! Documentation for that is here.
所指出的当 Proc IMPORT
运行时,它会创建变量名称符合导入时 VALIDVARNAME
设置的数据集。因此,一种替代方法是在 IMPORT 之前设置选项以确保 'clean' 变量名称,然后再将其重置。
%let setting = %sysfunc(getoption(VALIDVARNAME));
options validvarname=v7;
Proc IMPORT ... ;
...;
run;
options validvarname = &SETTING;
例子
filename have temp;
data _null_;
file have;
put 'Name,"Age","Date of Birth",School:First,Surprise!,-Feedback';
put 'Abel,0,Yesterday,Eastern Acacdemy,Balloons!,None';
run;
options validvarname=any;
proc import file=have replace out=have_any dbms=csv;
getnames=yes;
run;
options validvarname=v7;
proc import file=have replace out=have_v7 dbms=csv;
getnames=yes;
run;
options validvarname=any;