分类:医学统计

关键词:宏程序统计报表DDEODSSAS

正文

sas的统计分析结果输出到Word文档中,实现起来并不复杂,利用SAS提供的ods(Output Delivery System,输出传递系统),可以很方便的将结果输出到.rtf(也就是Word格式文档)、.html(网页)以及PDF文档中。
最简单的实现:
ods rtf file="filepath:docname.rtf";
proc step
...
ods rtf close;
然后非常不幸的是,上述输出结果是系统默认的,是SAS系统已经预定义好的格式(几乎所有的情况下都不符合我们的要求),如果想用ODS系统实现统计报表的定制输出,实现过程就要复杂的多。

事实上,运行在OS/2及Windows操作系统下的SAS系统,还有另外一种与其它应用程序交互的技术,那就是Dynamic Data Exchange,动态数据交换技术,简称DDE

DDE与ODS最大的不同在于,DDE的实现过程相对透明且是实时交互,而ODS则是将所有输出结果“打包”后按固定格式(除了 print,report和tabulate这三个过程)输出。做个不大恰当的比方,DDE就好像买电脑时的攒机DIY,每个散件你可以自己挑,而ODS 则是只卖整机,虽然ODS也允许你定制,但给你的只是整机。

DDE与ODS在统计报表中都有应用,但作为两种不同的技术,无所谓孰优孰劣,我只关心利用它们我能实现什么。统计报表的输出,最重要的是规划统计 表的结构,以及表格中每个单元格的数据和它的形式。利用ODS可以获取需要的数据集,修剪之后,再利用proc template定制的表格,可以实现自定义输出,但在数据的细节上,比如最常用的卡方检验,频率及百分比的输出,如果要用template定制的 table将上述两个数据输出到一个单元格,格式为N(m%),那是很困难的。但应用DDE技术,你可以实现对Word文档的完全操控,特别是那些细节之 处,而需要你掌握的WordBasic语句并不多。

好了,字数也码得差不多了,来看一个例子:一个宏程序,打开一个空白的Word文档,然后建立一个名为docname,路径为filepath的Word文档。
%macro helloword(filepath,docname);
/*** start word application ***/
options noxsync noxwait xmin;
filename cmds dde 'winword|system';
data _null_;
length fid rc start stop time 8;
fid=fopen('cmds','s');
if (fid le 0) then do;
rc=system('start winword');
start=datetime();
stop=start+10;
do while (fid le 0);
fid=fopen('cmds','s');
time=datetime();
if (time ge stop) then fid=1;
end;
end;
rc=fclose(fid);
run;
/*** define the document name and the file path ***/
data _null_;
file cmds;
put '[FileClose 2]‘;
put ‘[FileNew.Template="Normal.dot"]‘;
put ‘[ChDefaultDir "'"&filepath"'",0]‘;
put ‘[FileSaveAs.Name="'"&docname"'",.Format=0]‘;
put ‘[AppMinimize]‘;
run;
%mend;
比如,我要在C盘myfile目录下建立一个名为output.doc的文档:
%helloword(c:\myfile\,output);
然后,我要在这个Word文件中写几个字,然后保存:
data _null_;
file cmds;
put '[Insert "Hello Word!"]‘;
put ‘[FileSave]‘;
run;
需要注意的是,上述目录必须存在,否则Word会报错,因为它不会创建目录。

转载原创文章,请注明:转载自益药,益友-Medleaf的医药博客[http://www.cnmed.net/blog/]
本文链接地址:http://www.cnmed.net/blog/2008/sas2word-with-dde.html

暂时没有人发言

我要发言