proc stremの世界

テキストファイルに任意の文字列、それもデータや出力結果じゃなくて
もっと文章的なものやプログラムコード、あるいはhtmlのようなマークアップファイル言語のファイル
を出力したい時ってありますよね。

基本今までは、fileステートメントと、putステートメントとかでやりくりする感じだったのですが
9.4から面白いプロシジャが追加されてました。
その名もstreamプロシジャです!!
(一応9.3から試用版で使えるみたいですが)

まずは何より、使用例を見ましょう!!

%let person1 = おじいさん;
%let person2  =おばあさん;
%let place1 = 小さな村;

filename a "C:\Users\SASYAMA\Desktop\test.txt";
proc stream outfile=a resetdelim="goto";
begin
むかしむかし &person1.と&person2.が&place1 に住んでおったそうだ goto NEWLINE;
&person1.は山に芝刈りにいき goto NEWLINE;
&person1.は川に洗濯にいった。
;;;;

まず、ちょっと変わってるのが、このプロシジャはrun;もquit;もつけません。
プロシジャの終わりをセミコロン4つのステートメントで示します。

で、上記を実行すると、test.txtが作成され、その中身は以下の感じです。







コードを解説すると、まずfilenameで名前付けしたものをoutfile=で指定します。

そしてbeginステートメント以下、書いた文字列がそのまま出力されます。
ただし改行コードの出力についてはそのままだと反映されません。
まずresetdelim=で、通常の文字列ではないことをSASに分からせるためのデリミタキーワードを
設定します。
今回はgotoがそれです。そして設定したキーワード + NEWLINEとすることでそれが改行となります。

さて、しょっぱなの例が意味不明でしたが、海外論文などをみるとweb系で、データに応じて複雑な
htmlを作らなければならないような方々にかなり歓迎されているようです。
単純なのを作ってみると

filename c "C:\Users\SASYAMA\Desktop\test2.html";
proc stream outfile=c;
begin
<html>
<head><title>stremプロシジャの世界へようこそ</title></head>
<body>
<h1>あなたのアカウント名は &sysuserid.. だ!</h1>
<h2>
今日の日付は
%sysfunc(today(),yymmdds10.)です。
</h2>
<h3>
こんな感じでマクロを絡めてのテキスト生成が楽なのです
</h3>
</body></html>
;;;;
run;

みたいな?










ただ、これだけだと、そこまで便利か?って感じですが、実はまだまだ奥深くて
たとえば以下のように外部ファイル b.txtが既にある場合







filename file_a "C:\Users\SASYAMA\Desktop\a.txt";
filename file_b "C:\Users\SASYAMA\Desktop\b.txt";

proc stream outfile=file_a resetdelim="goto";
begin
data A goto NEWLINE;
%include file_b; goto NEWLINE;
run;
;;;;

とすると、a.txtの中身は









このように、%includeによって外部ファイルの内容を展開して埋め込むことが
できます。
この機能が、パッチワーク的に複雑なテキストを構築しやすくて良いようです。

どうです??
単純だけど、結構可能性ありそうじゃないです?

ちなみに僕はかなりハマッてます!


1 件のコメント:

  1. Very interesting!
    One comment: "data A" must be "data A;".

    返信削除