今天小编打算分享一段关于RTF合并的小程序...在平时出Tabel的过程中,很多人都是一个表一个表的出,最后要面临一个RTF合并的过程,很多公司都有自己的方式进行合并,小编虽然没见过他们的代码,但是以小编浅薄的经验来看,原理大概也是大同小异。这篇推文小编要介绍的是小编用SAS实现RTF合并的原理以及过程。
RTF合并原理
首先要问一下。你有试过用记事本打开RTF文件吗?打开会发现什么呢。
显而易见,是一堆不说人话的编码...就是这样的一堆编码,是RTF合并成功与否的关键。SAS实现RTF合并的原理就是将RTF导入到SAS数据集中,然后通过数据集的追加,以及对编码的简单的处理,接着再输出,就完成了RTF的合并。
中间需要对编码处理的也不多,只要处理到满足RTF的格式就够了。一共只需要处理3个地方。
1.除首个RTF外,其他RTF第一行的“{”要删除。
2.除最后一个RTF外,其他RTF最后一行的“}”要删除。
3.在每个俩个RTF编码间插入下面这一串编码。
sectsectdlinex0endnherepgwsxn15840pghsxn12240lndscpsxnheadery1440footery1440marglsxn1440margrsxn1440margtsxn1440margbsxn1440
嗯,上面操作做完就大功告成了!虽然今天只测试了一次,但理论上没啥问题,并且也成功了。小编日常也用不上这种合并。
今天看有人在问RTF的合并,所以临时兴起,写了一下。下面来看看小编实现过程的代码。
实现过程
1.为了测试功能,小编先生成了3个单独的RTF文件。
生成代码如下:文末会上传至百度网盘,以供下载测试用。
2.在有了需要合并的文件后就开始了。
代码语言:javascript复制*获取指定路径RTF文件名称;
filename xcl_fil pipe "dir D:日常练习Back_temp_1CombineTableTFL*.rtf /b/s";
data add_rtflist;
infile xcl_fil truncover;
input fname $char1000.;
rtffn=strip("filename rtffn")||strip(_N_)||right(' "')||strip(fname)||strip('" lrecl=5000;');
run;
*在获取文件名称后,可以改变数据观测的顺序,以实现rtf文件合并的先后顺序(此处小编就不操作了);
%macro doloop;
data _null_;
set add_rtflist end=last;
call execute(rtffn);
if last then call symput('maxn',vvalue(_N_));
run;
%put &maxn.;
%do i=1 %to &maxn.;
/*将文件导入SAS中,变成SAS数据集*/
data have&i. ;
%let _EFIERR_ = 0;
infile rtffn&i. ;
informat line $5000.;format line $5000.;length line $5000.;input line $ @@;run;
/*实现上面说的三个处理过程:
1.除首个RTF外,其他RTF第一行的“{”要删除。
2.除最后一个RTF外,其他RTF最后一行的“}”要删除。
3.在每个俩个RTF编码间插入一行。这样一行放下面一串代码。
sectsectdlinex0endnherepgwsxn15840pghsxn12240lndscpsxnheadery1440footery1440marglsxn1440margrsxn1440margtsxn1440margbsxn1440
*/
%if &i. eq 1 %then %do;
data want;
set have&i. end=last;
if last then line="pard";
run;
%end;
%if &i. ne 1 %then %do;
proc sql;
insert into want(line) values ('sectsectdlinex0endnherepgwsxn15840pghsxn12240lndscpsxnheadery1440footery1440marglsxn1440margrsxn1440margtsxn1440margbsxn1440');
quit;
data have&i.;
set have&i. end=last;
if last then line="pard";
if _n_=1 then line=substr(line,2);
run;
data want;
set want have&i. ;
run;
%if &i. eq &maxn. %then %do;
data want;
set want end=last;
if last then line="pard}";
run;
%end;
%end;
%end;
/*
文件输出成合并完成后的RTF
*/
data _null_;
set want;
file "D:日常练习Back_temp_1CombineTablenew_file.rtf" lrecl=5000;
put line;
run;
%mend;
%doloop;
合并后结果如下:
测试过程程序可以点击下面网盘链接下载。
百度网盘链接:https://pan.baidu.com/s/1wlkpTSyhxwLKPgGoRGaiog
整个代码其实很少,一点也不多。代码可以直接复制拿去用!只需要修改几个路径就可以了!程序写的很粗糙,很多地方可以优化,小编日常也用不上,就懒得优化了