ラベル [▼ RWI入門 の投稿を表示しています。 すべての投稿を表示
ラベル [▼ RWI入門 の投稿を表示しています。 すべての投稿を表示

2015年5月11日月曜日

レポート作成インターフェイス(RWI)入門8


RWIでテキストを配置するメソッドを紹介。

 FORMAT_TEXT( data: "テキスト)



このメソッドと、以前紹介したREGIONメソッドを組み合わせれば、好きな位置に好きなテキストを配置できます。


ods html close;
ods pdf file="出力するファイルのパス\TEST.pdf";

data _NULL_;
  dcl odsout ob();
  ob.layout_absolute();

     ob.region( x:'1cm',  y:'2cm',  width:'8cm');
     ob.format_text( data:"aaaaaaaaaaa" );

     ob.region( x:'5cm',  y:'3cm',  width:'8cm');
     ob.format_text( data:"bbbbbbbbbb" );

  ob.layout_end();

run;

ods pdf close;
ods html;

TEST.pdf


2014年12月17日水曜日

レポート作成インターフェイス(RWI)入門7


RWIで画像ファイルを配置するメソッドを紹介。

  IMAGE( file: "画像ファイルのフルパス)



簡単な例ですが、スマホで撮った写真を配置してみます。
(以降、HTMLへの出力が有効になっている前提)

data _NULL_;

  dcl odsout ob();
  ob.image( file: "画像ファイルのパス\flower.jpg" );

run;


結果



実務では、SASで作ったグラフを、画像ファイルとして保存しておき、それを配置するってことも出来ます。


ちなみに、写真の花は堀切菖蒲園というところで撮ったやつです。
花びらがクシャッと垂れた感じがかわいいですね。



2014年12月12日金曜日

レポート作成インターフェイス(RWI)入門6


RWIで改ページを設定するメソッド。

  PAGE()



プログラムと結果を見てみましょう。
(以降、HTMLへの出力が有効になっている前提)

data _NULL_;
  dcl odsout ob();

     *** 1ページ目 ;
     ob.table_start();
         ob.row_start();
            ob.format_cell( data:"aa" );
         ob.row_end();
     ob.table_end();

     ob.page();

     *** 2ページ目 ;
     ob.table_start();
         ob.row_start();
            ob.format_cell( data:"bb" );
         ob.row_end();
     ob.table_end();
run;

結果



レポートを作るうえで大事なメソッドです。

2014年12月8日月曜日

レポート作成インターフェイス(RWI)入門5



RWIで、複数の表を好きな位置に配置する方法を紹介。

ods html close;
ods pdf file="出力するファイルのパス\test.pdf";

data _NULL_;
  dcl odsout ob();

  * レイアウト設定開始 ;
  ob.layout_absolute();

     * 1個目の表を配置 ;
     ob.region( x:'1cm', y:'1cm' );
     ob.table_start();
         ob.row_start();
            ob.format_cell(data:"aa");
            ob.format_cell(data:"bb");
         ob.row_end();
     ob.table_end();

     * 2個目の表を配置 ;
     ob.region( x:'5cm', y:'2cm' );
     ob.table_start();
         ob.row_start();
            ob.format_cell(data:"cc");
           ob.format_cell(data:"dd");
         ob.row_end();
     ob.table_end();

  ob.layout_end();
run;

ods pdf close;
ods html;


結果




解説


今回使うlayout_absoluteメソッドは、マニュアルにPRINTER出力のみ対応してるよと書いてあります。
なので、HTML出力を閉じておき、PDFファイルに出力します。

  ods html close;
  ods pdf file="出力するPDFファイルのフルパス";


好きな位置に配置するためのレイアウトを開始。

  layout_absolute()


表を配置する前にregionメソッドで領域の出力位置を設定。
ただ、いまいち分からないのが、例えば位置を5cmと設定して、出力されたpdfを倍率100%にして見ても5cmのところに配置されてるわけでもなさそう?。。どういう基準で配置されてるのかよく分からないです。

  region( x : 'xの位置' ,  y : 'yの位置' )


レイアウト設定を終了させます。

  layout_end()


PDF出力を閉じて出力完了。あと最後にデフォルトの出力先をHTMLにしてます。

  ods pdf close;
  ods html;


イメージとしては、スクラップブックのように、いろんな表やグラフを好きな位置にペタペタ貼る感じです。


また別の記事で、応用例(遊び)を紹介したいと思います。



RWI入門記事一覧
1.基本構文
2.データセットの中身を出力する
4.複数の表を並べる
5.複数の表を好きな位置に配置する

2014年11月17日月曜日

レポート作成インターフェイス(RWI)入門4


RWIで複数の表を並べる方法を紹介します。
まずは以下のプログラムを実行して結果を見てみましょう。

(以降、HTMLへの出力が有効になっている前提)

data _NULL_;
   dcl odsout ob();

   * グリッドを設定する ;
   ob.layout_gridded( columns:2, rows:2 );

       * 1個目の表を配置 ;
       ob.region();
       ob.table_start();
          ob.row_start();
               ob.format_cell(data:"aa");
               ob.format_cell(data:"bb");
          ob.row_end();
       ob.table_end();

       * 2個目の表を配置 ;
       ob.region();
       ob.table_start();
          ob.row_start();
               ob.format_cell(data:"cc");
               ob.format_cell(data:"dd");
          ob.row_end();
       ob.table_end();

       * 3個目の表を配置 ;
       ob.region();
       ob.table_start();
          ob.row_start();
               ob.format_cell(data:"ee");
               ob.format_cell(data:"ff");
          ob.row_end();
       ob.table_end();

   ob.layout_end();
 run;

結果



解説


まずは、表を配置する列数と行数を設定。
  layout_gridded( columns:列数 , rows:行数  )


そしたら、表を配置する前に以下のメソッドを書くだけです。
  region()


最後にレイアウト設定を終了させます。
  layout_end()



例えば列2×行2のレイアウトを作って表を配置するイメージはこんな感じ。














regionメソッドを書く度、左から右、次の行の左から右に、、、と表をどんどん配置していきます。


ちなみに。。

長くなるので紹介は出来ませんでしたが、imageメソッドというのがあり、表だけじゃなくグラフなどのイメージも配置できちゃうので、色々遊べそうです。

2014年11月4日火曜日

レポート作成インターフェイス(RWI)入門3


今回はRWIで、セル結合する方法を紹介。
(以降、HTMLへの出力が有効になっている前提)


横結合する構文 :  format_cell( column_span: 結合する数 )

data _NULL_;

    dcl odsout ob();
    ob.table_start();

          * 1行目を出力 ;
          ob.row_start();
              ob.format_cell(data:"aa");
              ob.format_cell(data:"bb");
          ob.row_end();

          * 2行目を出力 ;
          ob.row_start();
              ob.format_cell(data:"cc", column_span:2);
          ob.row_end();

    ob.table_end();
run;

結果


縦結合する構文 :  format_cell( row_span: 結合する数 )

data _NULL_;

    dcl odsout ob();
    ob.table_start();

          * 1行目を出力 ;
           ob.row_start();
                ob.format_cell(data:"aa");
                ob.format_cell(data:"bb", row_span:2);
           ob.row_end();

          * 2行目を出力 ;
           ob.row_start();
                ob.format_cell(data:"cc");
           ob.row_end();

    ob.table_end();
run;

結果



実際の使用例

*** サンプルデータ ;
data DT1;
    A="001"; B="AA"; output;
    A="001"; B="BB"; output;
    A="002"; B="CC"; output;
    A="002"; B="DD"; output;
    A="002"; B="EE"; output;
run;

  A  
B
  001 
  AA   
  001
  BB
  002
  CC
  002 
  DD  
  002
  EE

上のサンプルから、RWIを使って以下のように出力してみます。
(Aの値が同じものをセル結合させる)



*** ① Aの値が同じもの同士の数を求める ;
proc sort data=DT1;
    by A;
run;

proc sql;
    create table DT2 as
    select A, count(*) as _COUNT
    from DT1
    group by A;
quit;

  A  
 _COUNT 
 001 
  2
 002
  3


*** ② RWIでセル結合した表を作る ;
data _NULL_;

    merge DT1 DT2 end=EOF;
    by A;

    *** データステップの最初だけ実行する部分 ;
    if _N_=1 then do;

        * RWIを使えるようにして表作成を開始 ;
        dcl odsout ob();
        ob.table_start();

        * 項目名を出力 ;
        ob.head_start();
        ob.row_start();
            ob.format_cell(data:"A");
            ob.format_cell(data:"B");
        ob.row_end();
        ob.head_end();
    end;

    *** データの中身を出力 ;
    ob.row_start();
        if  first.A then  ob.format_cell( data:A, row_span: _COUNT);
        ob.format_cell(data:B);
    ob.row_end();

    *** 最後に表作成を終了 ;
    if EOF then ob.table_end();
run;


ざっくり解説
① まずAの値が同じもの同士の数を求める。
方法はDATAステップでも何でもいいけど、とりあえずSQLで求めてます。

② 次にRWIで表を作ります。ポイントは以下。

if  first.A then  ob.format_cell( data:A, row_span: _COUNT);

BY変数Aの値が同じもの同士の先頭行で、format_cellメソッドを実行。
そこで先にSQLで求めた変数_COUNTをセル結合する数として指定してます。


📝注意


記事の中で使用している「_N_」「END=オプション」「FIRST.BY変数」は「サブセット化IF」と一緒に使用すると正しく動かなくなる事があります。


2014年10月24日金曜日

レポート作成インターフェイス(RWI)入門2




今回はデータセットの中身をRWIで出力する方法を紹介。

(以降、HTMLへの出力が有効になっている前提)


出力するデータ
data DT1;
   V1=1; V2="AAA"; output;
   V1=2; V2="BBB"; output;
   V1=3; V2="CCC"; output;
run;

 V1  
 V2  
  1
 AAA  
  2
 BBB
  3
 CCC


RWIを使って出力

data _NULL_;

   set DT1 end=EOF;

   *** データステップの最初だけ実行する部分 ;
   if _N_=1 then do;

       * RWIを使えるようにして表作成を開始 ;
       dcl odsout ob();
       ob.table_start();

       * 項目名を出力 ;
       ob.head_start();
       ob.row_start();
            ob.format_cell(data: "V1",  style_attr: "background=blue color=white");
            ob.format_cell(data: "V2",  style_attr: "background=blue color=white");
       ob.row_end();
       ob.head_end();

   end;


   *** データの中身を出力 ;
   ob.row_start();
        ob.format_cell(data: V1);
        ob.format_cell(data: V2);
   ob.row_end();

   *** 最後に表作成を終了 ;
   if EOF then ob.table_end();
run;

結果ビューア





処理の流れ


set DT1 end=EOF;

まず、出力するデータセットDT1を読み込む。
end=EOF」で最終オブザベーションを読み込むとき一時変数EOFに「1」が入る。(この一時変数は後で使う)

 ちなみに今回は一時変数名をEOFという名前にしているけど、任意の名前で指定可能。
 

*** データステップの最初だけ実行する部分 ;
if _N_=1 then do;

    * RWIを使えるようにして表作成を開始 ;

    dcl odsout ob();
    ob.table_start();

    * 項目名を出力 ;
    ob.head_start();
    ob.row_start();

         ob.format_cell(data: "V1",  style_attr: "background=blue color=white");
         ob.format_cell(data: "V2",  style_attr: "background=blue color=white");
    ob.row_end();
    ob.head_end();

end;

オブザベーションを読み込むたびに実行する必要がない箇所、
つまり最初の1回実行するだけでいい箇所を「if _N_=1 then do;」と「end;」で囲んであげる。

今回新たに登場した「head_start」「head_endメソッド」では、囲んだ範囲をヘッダーとして扱うことが出来ます。

また、「format_cellメソッド」の「style_attr」というのは、セルのスタイル属性を設定するオプションで、今回は背景色=青、文字色=白にしてます。

セルのスタイル設定
参照名.format_cell( data: "表示するテキスト",  style_attr: "スタイル属性")

使いたいスタイル属性は、SAS社の提供してるODSのリファレンスを参照ください。


*** データの中身を出力 ;
ob.row_start();
     ob.format_cell(data: V1);
     ob.format_cell(data: V2);
ob.row_end();

オブザベーション毎に変数値を出力


if EOF then ob.table_end();

一番最初に作った一時変数EOFを使って、最後に表作成を終了させる。




📝注意
記事の中で使用している「_N_」と「END=オプション」は「サブセット化IF」と一緒に使用すると正しく動かなくなりやすいです。

2014年10月22日水曜日

レポート作成インターフェイス(RWI)入門1


「Report Writing Interface」略してRWIと言われる機能がSAS9.4から追加されました。
SAS9.4より前のバージョンでも評価版として一部機能は使えます。


RWIを使うと、データステップ上で柔軟にレポートを作成することができます。
マニュアルには、出力先としてHTMLやPRINTERを選択できるよと書いてあります。


まずは簡単に、適当な表を作ってみましょう。
(以降、HTMLへの出力が有効になっている前提)


data _NULL_;

   *** ① RWIを使えるようにする **********;
   dcl  odsout ob() ;

   *** ② 表作成開始 *******************;
   ob.table_start();

      *** 1行目出力 ;
      ob.row_start() ;
          ob.format_cell( data: "1") ;
          ob.format_cell( data: "aaa") ;
      ob.row_end() ;

      *** 2行目出力 ;
      ob.row_start() ;
          ob.format_cell( data: "2") ;
          ob.format_cell( data: "bbb") ;
      ob.row_end() ;

  ob.table_end() ;

run;


結果



解説

① まず最初に「dcl odsout ob()」は「obって名前でRWIを使えるようにするよ」みたいな事をいってます。
ここはobじゃなくても好きな名前でok

② そのあとは「ob.メソッド()」で表を作る各メソッドを実行しています。
以下に各ステートメントやメソッドについてまとめました。

ステートメントとメソッドの説明
 dcl odsout 参照() 

 指定した参照名でRWIを使えるようにする 

 参照.table_start()

 表の作成開始

 参照.table_end()

 表の作成終了

 参照.row_start()

 行の作成開始

 参照.row_end() 

 行の作成終了

 参照.format_cell( data:"表示するテキスト")

 セルを作成


メソッドのざっくりしたイメージ。



























以上が、もっとも基本的な部分です。
HTMLで<table><tr><td>のようなタグを作るようなイメージに似てますね。



RWI入門記事一覧
1.基本構文
5.複数の表を好きな位置に配置する
6.改ページの設定
7.画像ファイルを配置する