一、option center
所有的输出表格可以用option center;或option nocenter;控制,如果是center,则输出结果居中,否则靠左。
option center;效果
option nocenter;效果
二、有关文字编码的冷知识
1、unicode和unicodec函数可以用来解码
2、btye
3、可以获取文字中的中文,compress(compress(s,,'n'),,'kl')。其中“l”意思是小写字母和中文,“n”表示大小写的英文字母和下划线。
三、关于proc report
define中的group,一定要配合聚合的统计量使用。如果没有会出一段黑字。我们可以用order替换掉group就不会有这个问题了。
四、Hash连表选取所有变量
一般来讲,hash方法在data步中,变量是无法在编译阶段识别的。所以必须在代码中让相关变量出现在代码中,以及确定变量长度。如下例:
length QNAM QVAL $200.;
if _n_=1 then do;
declare hash dvh(dataset:'XX');
dvh.definekey('SUBJID');
dvh.definedata('QNAM','QVAL');
dvh.definedone();
call missing(QVAL,QNAM);
end;
但是,有的时候一个一个的选入变量会比较痛苦,于是有了如下办法:
if _n_=1 then do;
if 0 then set XX;
declare hash dvh(dataset:'XX');
dvh.definekey('SUBJID');
dvh.definedata(all:'y');
dvh.definedone();
end;
先在代码中使用set语句,从而直接确定选入的变量名和长度,然后通过一个虚假的if语句,使得set语句在事实上不可能执行。这样就省掉了确定变量及其长的length语句,和防止NOTE的call missing。这样做的好处是不必一个一个的去设定变量,坏处是:
1、被set的数据集中所有的变量都会被导入到data步中,有时可能会发生意想不到的覆盖或bug。
2、这样做连接进入的变量是retain的。
五、array语句可以定义临时数组_TEMPORARY_。无论是临时的还是定义好的,只要在array语句规定变量值,那么他是retain的,但如果不规定,即使是新建变量也不是retain的。array语句是在PDV阶段前执行的。
六、当是用put进行字符到字符的转换时,输入变量类型错误是会导致报错的。
七、当两个数据集set到一起的时候,相同名字的变量可能长度不同,这会导致后面的数据截断。尤其是两个数据集是excel导入的时候要注意。
八、比较符号=:
该符号可以比较其中一个比另一个长,而且前半部分相等的字符串。例如:a=‘1234’,b=‘12345’。此时a=b是不成立的,但是a=:b是成立的。
九、dosubl函数
可以直接执行SAS的代码,它不是放在宏编译器里执行宏语句,而是直接中断当前的程序,先讲代码作为普通程序执行。个人理解是中断当前的程序,另外开一个input stacker单跑普通程序。
宏里的示例:
%let rc = %sysfunc(dosubl(proc print data=sashelp.class;run;));
具体情况有待研究。。。。