RTF出力の新視点-STREAMプロシジャの応用力は侮れないという話

RTF出力、実は未だあんまり経験ないんですが、色々大変なのはわかります。

多分おおまかに2つ方法があって、一つはODS RTFを利用する方法、もう一つはputでタグ情報と共にデータを出力して作ってしまう方法だと思います。
どちらも過去のユーザー総会等で素晴らしい発表が多くでているので、そちらを参照してください。

まあ、それで終わりの話なんですが、僕はひねくれているので、何か他に面白い方法はないかなと考えてました。

上記の2つの方法もファイルの新規作成なので、書式等の調整も全てコードでやる必要があります。
要するに、あらかじめ用意したRTFファイルに値を差し込む方法ではないということです。
(一応DDEを使った既存WORDファイルへの値入れする方法もあるみたいですが、少なくとも日本ではあんまり主流ではない気がします)

そこで、書式設定等を済ませたテンプレートRTFにSASから出力する新しい方法について紹介します。

ズバリproc streamを使います! 9.4からの新プロシジャです。一応9.3でも正式版ではないですが実行できます。

proc stream?って方は過去記事
「proc stremの世界」
http://sas-tumesas.blogspot.jp/2015/07/proc-strem.html

を見てください。

要はマクロ変数を展開したテキスト生成ができるプロシジャで、普通の平テキストはもとより、HTMLやXML、RTFなどタグ言語の生成に強みがあるんですね。

さあ、前置きが長くなりましたが、やっと本題に行きます。


まず、ノートパッドでもMS WORDでもいいので、以下の様な出力テンプレートを拡張子RTFで作成、保存してください。(例は「テンプレート.rtf」という名前で保存)



ちなみに値を差し込みたい部分をマクロ変数で記述します。

で、例えば以下の様なデータセットがあった場合







data _NULL_;
set SALES end=eof;
call symputx(ITEM,SALE);
TOTAL+SALE;
if eof then call symputx('TOTAL',TOTAL);
run;

とでも書いて、とりあえずテンプレートのマクロ変数名に合わせて、マクロ変数を作ってやります。

そうしたら、いよいよ次のように書きます

filename in "/home/sasyamasasyama0/テンプレート.rtf" lrecl = 32755;;
filename out "/home/sasyamasasyama0/アウトプット.rtf" lrecl = 32755;;
proc stream outfile=out resetdelim="rdlm" quoting=single;
begin
rdlm; %include in;
;;;;

これだけです。

実行すると、「アウトプット.rtf」ができて、それを開いてみると















と、値が展開されていることがわかります。

どうでしょう?
結構面白いですよね。

resetdlm=で、リセットデリミタを指定しています。リセットデリミタの後に%includeを記述しないと、ただのテキストとして「%include」ってでちゃいます。
%include ファイル名で、指定したファイルをproc streamの中に展開します。そこでその中に含まれるマクロ変数が展開されるわけです。

こういうレイアウトが固定されたrtfに値を出すのには結構向いていると思います。
まあ、多分ご想像されているとおり、表がデータに応じて可変だったり、出力する値の数が多いものには正直オススメできないですね。
(できなくはないけど、それに応じて表を構成するためのタグを作って一緒に出す必要があるので、putで出す際のコードをマクロ化してstreamの中で展開するイメージになるので、お手軽さがなくなる)

定型のちょっとしたレポート向きだと思いますが、知っていて損はない使い方だと思います。

以上です。

0 件のコメント:

コメントを投稿