SAS包含特殊字符的变量列表

时间:2018-02-21 14:43:23

标签: sas special-characters

我是SAS编程的新手,我正在尝试创建old_variable名称列表,以便我可以使用它们(子集,重命名,空格等),但变量名称有时髦的字符(#,括号,单引号,数字,你的名字)。每个变量用';'分隔 - 分隔源文件采用csv格式。我需要为44个不同的文件做这个,每个文件有大约199个变量。

到目前为止,我已经尝试了一个宏,我创建了一个变量列表,但是,当我尝试使用宏和变量因为特殊字符时,代码失败了。我已经检查了SAS论文005-2013,但我相信我不确定如何使用我的代码中的函数。

任何见解或指示都将不胜感激。这是我到目前为止尝试的代码:

1)导入:

proc import datafile='file_oldname.csv'
 dbms=csv
 out= oldName
 replace;
 delimiter=',';
 getnames=yes;  
run;

2)制作oldNames列表; *一个宏变量,包含旧变量名称; *使用Proc Contents和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以便可以使用带有特殊字符的变量名?我想用新名称进一步重命名它们。

非常感谢!

2 个答案:

答案 0 :(得分:0)

由于您的变量名称包含特殊字符,因此需要以"name literal!"n格式引用它们。

尝试:

options VALIDVARNAME=ANY;
proc sql noprint;
select distinct nliteral(name) 
  into:vars separated by ' ' 
  from listOldName;

%put &=var;

documentation中有关名称文字的更多信息。

编辑 - 正如@ Tom所指出的,nliteral函数可以轻松地涵盖您需要的转换!该文档为here

答案 1 :(得分:0)

运行Proc IMPORT时,会在导入时创建符合VALIDVARNAME设置的变量名称的数据集。因此,另一种方法是在IMPORT之前设置选项以确保“干净”变量名称,然后重置它。

%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;