SAS合并RTF报表时列标签前导空格丢失问题求助
解决SAS导出合并RTF时前导空格缩进丢失问题
RTF格式默认会忽略文本开头的普通空格,这就是SAS数据集中保留了前导空格,但导出后的RTF文件不显示缩进的原因。以下是几种可行的解决方法:
方法1:替换前导空格为RTF非换行空格
RTF中的\~代表非换行空格,不会被格式忽略。可以通过PRXCHANGE函数将前导空格批量替换为该字符:
data _null_; set result_s1 end=eof ; file "../../documentation/combined.rtf" ; if not delete then do; length temp $32767; if outrtf eq "" then do; temp = prxchange('s/^(\s+)/repeat("\~", length($1))/e', 1, inrtf); put temp; end; else do; if eof then do; temp = prxchange('s/^(\s+)/repeat("\~", length($1))/e', 1, inrtf); put temp; end; else do; temp = prxchange('s/^(\s+)/repeat("\~", length($1))/e', 1, outrtf); put temp; end; end; end; run;
方法2:使用RTF原生缩进控制代码
RTF支持\liN控制语句(N为缩进的twip值,1twip=1/20磅),直接给需要缩进的行添加该代码更规范:
data _null_; set result_s1 end=eof ; file "../../documentation/combined.rtf" ; if not delete then do; if outrtf eq "" then do; if prxmatch('/^\s+/', inrtf) then put '\li200 ' inrtf; else put inrtf; end; else do; if eof then do; if prxmatch('/^\s+/', inrtf) then put '\li200 ' inrtf; else put inrtf; end; else do; if prxmatch('/^\s+/', outrtf) then put '\li200 ' outrtf; else put outrtf; end; end; end; run;
注:示例中\li200代表缩进10磅,可根据需求调整数值。
方法3:替换前导空格为RTF制表符
如果缩进是固定4空格层级,可将前导空格替换为RTF制表符\tab(需确保RTF已定义对应制表位):
data _null_; set result_s1 end=eof ; file "../../documentation/combined.rtf" ; if not delete then do; length temp $32767; if outrtf eq "" then do; temp = prxchange('s/^(\s{4})+/repeat("\tab", countn($1, " ")/4)/e', 1, inrtf); put temp; end; else do; if eof then do; temp = prxchange('s/^(\s{4})+/repeat("\tab", countn($1, " ")/4)/e', 1, inrtf); put temp; end; else do; temp = prxchange('s/^(\s{4})+/repeat("\tab", countn($1, " ")/4)/e', 1, outrtf); put temp; end; end; end; run;
内容的提问来源于stack exchange,提问作者Shaik Khadar
相关产品推荐
相关产品推荐

