2016年4月20日水曜日

ODSグラフ(SG系グラフ)保存時の落とし穴




いままで、SGPLOTで作ったグラフをpngファイルとして保存する際、以下のように書いてました。
使用してたバージョンはSAS9.2です。


9.2 (実行結果は環境・設定によって異なる)
 ods graphics  /  reset=index  imagename="SAMPLE"  imagefmt=png ;
 ods listing gpath="C:\TEST";

      proc sgplot data=SASHELP.CLASS;
         scatter x=HEIGHT y=WEIGHT;
      run;

 ods listing close;
 ods graphics  /  reset=all;
 ods listing;


ログ
NOTE: C:\TEST\SAMPLE.png に書き込まれたイメージ出力を一覧表示します。
NOTE: データセット SASHELP.CLASS から 19 オブザベーションを読み込みました。




で、最近9.3で同様のプログラムを実行しました。(「imagefmt」はオプション名が「outputfmt」に変わったのでそこを変更してるのと、最後の「ods listing;」は削ってます)

9.3  (実行結果は環境・設定によって異なる)
 ods graphics  /  reset=index  imagename="SAMPLE"  outputfmt=png ;
 ods listing gpath="C:\TEST";

      proc sgplot data=SASHELP.CLASS;
         scatter x=HEIGHT y=WEIGHT;
      run;

 ods listing close;
 ods graphics  /  reset=all;


ログ
NOTE: C:\TEST\SAMPLE1.pngに書き込まれたイメージ出力を一覧表示します。
NOTE: データセットSASHELP.CLASSから19オブザベーションを読み込みました。



それぞれのログを見ると、保存されたファイル名が異なってますよね。
9.2 ・・・ SAMPLE.png
9.3 ・・・ SAMPLE1.png

とある設定によって、上記のファイル名にならない方もいるはずで、そこがまた厄介。
ファイルの取り違いを起こしそうで、ちょっと危険です。



原因、の前に前提知識

画像ファイルが作成されるたびに「SAMPLE.png、SAMPLE1.png、SAMPLE2.png、SAMPLE3.png・・・」とファイル名の末尾が+1される仕組みになっていて、同じプログラムを複数回実行すると、+1ずつカウントが増えていってしまいます。
なので「ods graphics / reset=index」で前回実行時のカウントをリセットしていますが、9.3では何故か+1カウントされたような名前「SAMPLE1.png」になってるのが不思議ですよね。
しかも、複数回実行しても、毎回「SAMPLE1.png」というファイル名になって、「SAMPLE2.png、SAMPLE3.png・・・」とカウントが増えていくわけでもないのがまた不思議。



原因

9.3からSASのアウトプットのデフォルトがHTMLに変わったことが影響してます。

  • HTMLに表示されるグラフは、裏でグラフの画像ファイルが作成されています。
  • 今回の例ではまずHTMLに表示するグラフの画像ファイル「SAMPLE.png」が作成されます。
  • 次に「ods listing gpath="C:\TEST"」と書いてるので、ods listing出力先でもグラフの画像ファイルが作成されます。これは2個目の画像ファイルなので、+1カウントが進んで「SAMPLE1.png」となってしまいますよね。
  • HTML以外の一部ODS出力先も、裏で画像ファイルを作ってしまうものがあって、それらODS出力先が開いたままだと同様に保存する画像ファイル名の末尾がずれてしまいます。



解決策

先に開いているODS出力をCLOSEすればOK。

今回の例ではHTMLが出力先としてアクティブになっていたので、
先頭に「ods html close;」、末尾に「ods html;」を入れることで「SAMPLE.png」というファイル名にする事が出来ました。

0 件のコメント:

コメントを投稿