也许你会诧异,为什么要问这个问题。SAS要编程,要编程就要用英文,英文编程变量当然是英文了。但是当我们拿到一堆别人给我们的Access数据文件、EXCEL数据文件,或者是EpiData 数据文件,打开一看,发现里面几百个变量全部都是中文时(不要说这种情况你没遇到过,或者你坚信你不会遇到),我们会怎么想:改成英文变量名?如果有那份毅力和决心,花几个小时全部逐一改的话,那确实令人佩服。不过,我们大多数人肯定会想:SAS 支持中文变量名吗?能的话我就可以直接导入了事了。
于是你用infile语句,用proc import过程等开始倒腾,很可惜,SAS全都报错。可能你会就此止步,叹息道:“看来SAS确实不能支持中文”。SAS不能支持中文变量名吗?答案当然是能的。不过我们需要稍做一些设置,扩展一下SAS默认的命名规则。 方法是:
options validvarname=any;
或许很多SAS USER都已知道。不过我们还是可以稍微扩展下。
实际上,SAS的命名规则有三个版本。V7,UPCASE和ANY。SAS默认的是V7。
其规则是:
- 最长32字符
- 首字符可以拉丁字母和下划线,后继的字符可是字母和下划线,还有数字符号
- 末尾空格忽略,且左对齐
- 中间不能包含空格和特殊字符(下划线除外)
- 字符大小写均可,不作区分
- 不能为SAS自动变量,如_N_、_ERROR_等
可见,默认的SAS命名系统V7不并支持中文、也不支持变量名中有空格。要想打破这种限制,我们就可以将validvarname设置为any,这样就可以满足我们的要求了。为什么any就支持了?我们可以深入的查看一下,any 所支持的具体内容:
- 可以包含或以任何字符开头。包括空格、国家标标字符(national characters)、特殊字符以及多字节字符。
- 最长32位字符
- 不可包含空字节
- 保留开头的空格,舍弃末尾的空格
- 至少包含一个字符,不能全部为空。
- 字符大小写均可,不作区分
由此可见,指定为ANY后,我们不仅可以支持中文,还可以支持其它国家的文字。不过,需要小心的是,如果变量名不符合V7的规则,我们还需要名称文字(name literal)的形式命名。即用引号引起来,并在末尾加字符n, n大小写闺均可。如图片中的2-5个变量即是这种情况。但是如果只是汉字字符,好像可以不用名称文字形式。
至于upcase,我想,你肯定也经望文知意了。
附录:产生图片中的数据集的代码
options validvarname=any; data webgu; SAS中文变量名="YES"; SAS中文變量名="YES"; '2SAS中文变量名'n="YES"; '2SAS中文變量名'n="YES"; 'SAS空 格变量名'n="YES"; 'SAS空# @ %格特殊字符变量名'n="YES"; run;