本文默认:ods escapechar="^";
一、上下角标——super/sub
上角标举例:“BMI(kg/m^{super 2})” “体重指数^{super *}”
下角标举例:"T^{sub max}" "AUC^{sub 0-t}"
ods escapechar="^";
data rep1;
item = "S01001^{super *}";
col1 = 2.528;
col2 = 163.725;
run;
proc report data=rep1 nowindows headline headskip spacing=0;
column item col1-col2;
define item / display flow " 受试者";
define col1 / display flow " T^{sub max}";
define col2 / display flow " C^{sub max}" ;
run;
二、其他特殊字符——unicode
unicode其实是一种编码,是为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。与ASCII编码不同,unicode编码通常是2个字节。
特殊符号与Unicode的对应关系可以在这个链接上查询
ods escapechar="^";
data rep1;
item="S01001^{unicode 26}S01002";/*添加一个&(unicode 十六进制=26)*/
col1 = 2.528;
col2 = 163.725;
run;
ods rtf file="&outputpath.example1.rtf";
proc report data=rep1 nowindows headline headskip spacing=0;
column item col1-col2;
define item / display flow " 受试者";
define col1 / display flow " T^{sub m^{unicode 61}x}";/*还可以嵌套使用;字母a(unicode 十六进制=61)*/
define col2 / display flow " C^{sub max}" ;
run;
ods rtf close;
unicode 还可用于删除特殊字符:
在判断两个字符串是否相等时,明明肉眼看着就是一模一样,但是代码运行结果显示却是不一样的。这个时候我们就要考虑,字符串中是否有一些“不可见”的字符,比如换行符、制表符tab、软回车等等。因为他们在SAS 的Output Data中属于不可见字符。
下面用换行符(控制字符)来举例:
data rep1;
length type str $200;
type = "无特殊字符";
str = "我是一名程序员";
klength=klength(str);
output;
type = "包含特殊字符";
str = "我是一名程序员"||byte(10); /*换行符的unicode,十进制=10,十六进制=0a*/
klength=klength(str);
output;
type = "删除特殊字符";
str = compress(str,'0a'x); /*换行符的unicode,十进制=10,十六进制=0a*/
klength=klength(str);
output;
run;
判断字符串长度是否与已知长度相等:正常情况下,klength(str1)的值应该是7,如果结果大于7,则说明有“不可见”的字符。(length同理,因为用中文举例所以直接使用klength)
利用unicode删除字符串中的特殊字符:compress(str1,'0a'x); 或者 tranwrd(str1,'0a'x," ");
三、其他特殊符号——raw
%、&在字符串中有其特定的含义,分别代表引用宏程序、引用宏变量。
还有转义字符,即ods escapechar="^"; 在我的环境下是^。
当我想要在字符串中正常显示%、&、escapechar时可以使用raw。
ods escapechar="^";
%let n1=10;
%let n2=8;
data rep1;
item = "S01001";
col1 = 0.81;
col2 = 0.72;
run;
proc report data=rep1 nowindows headline headskip spacing=0;
column item col1-col2;
define item / display flow " 受试者";
define col1 / display flow " 受试制剂(0.05%剂量) N=n1";/*这种写法会报错*/
define col2 / display flow " 受试制剂(0.15%剂量) N=n2";/*这种写法会报错*/
run;
如果不加处理,直接这样写,会报错说找不到名为“剂量”的宏程序
ods escapechar="^";
%let n1=10;
%let n2=8;
data rep1;
item = "S01001";
col1 = 0.81;
col2 = 0.72;
run;
ods rtf file="&outputpath.example1.rtf";
proc report data=rep1 nowindows headline headskip spacing=0;
column item col1-col2;
define item / display flow " 受试者";
define col1 / display flow " 受试制剂(0.05^{raw %}剂量) N=&n1";
define col2 / display flow " 受试制剂(0.15^{raw %}剂量) N=&n2";
run;
ods rtf close;