2020年6月15日月曜日

sgplotでemfファイルを出力する話

何回やっても次やるときにすっかり忘れて自分のプログラムを探す羽目になるのでここをメモ代わりにします.私以外の人に需要は無いと思いますがそんなことは知らぬ

sas9.4のsgplotで出力をemfファイルで出したい時の設定です.いっつもpngとかで出しがちなので覚えてないんですよね…emfにもいいところはあるのですが.

以下プログラム

/*----- 適当なデータ -----*/
data hoge ;
    call streaminit(1234) ;
    do X = 1 to 36 by 1 ;
        Y = int(rand("uniform") * 100) ;
        output ;
    end ;
run ;

ods html close ;   *--htmlをcloseしないとwarninig出る;
ods listing gpath = "hogehoge" ;
ods graphics on / reset = all imagename="hist1" imagefmt=emf ;

proc sgplot data = hoge nowall noborder ;
    vbar X / response = Y ;

    xaxis
        values = (1 to 25 by 1)
        label="発現時期"
    ;

    yaxis
        label="発現率(%)"
        values = (0 to 100 by 20)
    ;

run ;

ods graphics off ;
ods listing close ;
ods html ;  *-- 元に戻す ;

2020年6月1日月曜日

複数の文字変数をつないだら文字切れするのを回避する話

ついに月一の更新すら怪しくなったブログはこちらです.
コロナで生活リズム変わったからね仕方ないね
 
先日私の身辺でちょっと話題になったことをテーマにします.
フリーテキストのコメントを一覧表かなんかに出力する時に,想定より長いコメントが来て途中までしか出力出来てなかったことがありました.一覧表と言えばページ数がかさむので,途中で切れてないか目視チェックは結構厳しいところがあります.安易に変数長を200byteまでにすると200を超える長さのコメントが来るとか,出力の際に()付けたりとか複数のコメントを結合させて1か所に出せとか言われるとぽろっと後ろが切れたりします.お薬の英語名と日本語名と記載名とかもそうですが…

さりとて切れてるのがあるとお叱りを受けてしまうので何とかしないといけません.出力用の変数が十分な長さを持っているかをlengthnで取得して長さを比較すれば確認できますね.
 
data _null_ ;
    /*----- 元のコメント -----*/
    A = "日本語のコメントだよ" ;
    B = "qwertyuiop";
 
    /*----- 出力用変数 -----*/
    length OUT $24 ;
    OUT = A ||  "/" ||  B ;
 
    /*----- 各変数の長さを求める -----*/
    V_A = lengthn(A) ;
    V_B = lengthn(B) ;
    V_OUT = lengthn(OUT) ;
 
    /*----- 元の変数と区切り文字の長さの合計が出力用変数より長い場合にobs番号をログに表示 -----*/
    if V_A + V_B + 1 > V_OUT then putlog "E" "RROR/" _n_ ;
run ;
 
ってタラタラ書きましたけどさあcat系の関数使ったら結合後の文字変数の長さが足りない時はwarning返るよねえ…文字の結合を||でやってんのかね…

241
242  data _null_ ;
243
244     /*----- 元のコメント -----*/
245     A = "日本語のコメントだよ" ;
246     B = "qwertyuiop";
247
248     length hoge hoge2 hoge3 $24 ;
249     hoge = cat(A, "/" , B) ;
250     hoge2 = cats(A, "/" , B) ;
251     hoge3 = catx("/" , A , B) ;
252
253  run ;
WARNING: CAT関数の呼び出しで、結果に割り当てられたバッファの長さが十分ではなかったため、すべての引数を連結して含めることができませんでした。
         正しい結果には31文字が含まれますが、実際の結果は、呼び出し環境によって、24文字に切り捨てられた、またはすべてブランクの可能性があります。
         どの引数以降が切り捨てられたかを次に示します。
NOTE: 第3引数(関数CAT('日本語のコメントだよ','/','qwertyuiop'):行 249 カラム 8)は無効です。
WARNING: CATS関数の呼び出しで、結果に割り当てられたバッファの長さが十分ではなかったため、すべての引数を連結して含めることができませんでした。
         正しい結果には31文字が含まれますが、実際の結果は、呼び出し環境によって、24文字に切り捨てられた、またはすべてブランクの可能性があります。
         どの引数以降が切り捨てられたかを次に示します。
NOTE: 第3引数(関数CATS('日本語のコメントだよ','/','qwertyuiop'):行 250 カラム 9)は無効です。
WARNING: CATX関数の呼び出しで、結果に割り当てられたバッファの長さが十分ではなかったため、すべての引数を連結して含めることができませんでした。
         正しい結果には31文字が含まれますが、実際の結果は、呼び出し環境によって、24文字に切り捨てられた、またはすべてブランクの可能性があります。
         どの引数以降が切り捨てられたかを次に示します。
NOTE: 第3引数(関数CATX('/','日本語のコメントだよ','qwertyuiop'):行 251 カラム 9)は無効です。
A=日本語のコメントだよ B=qwertyuiop hoge=  hoge2=  hoge3=  _ERROR_=1 _N_=1
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.01 秒
      CPU時間            0.01 秒