SAS-如何简单快捷的实现RTF合并

2019-10-20 14:33:40 浏览数 (1)

今天小编打算分享一段关于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

整个代码其实很少,一点也不多。代码可以直接复制拿去用!只需要修改几个路径就可以了!程序写的很粗糙,很多地方可以优化,小编日常也用不上,就懒得优化了

sas

0 人点赞