包含特殊字符的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;