msglevel=iで文字列関数使用時にデフォルトのLength$200.が設定されたことを明示的にログにだす

SASには、多種多様の文字列操作系関数が備わっていますが一つ共通点があります。

それは文字列関数の戻り値をもって新規変数を作成する場合
その変数の長さ(LENGTH)はデフォルトで200となるという点です。
もし200以外の長さにしたければLENGTHステートメント等で長さを事前に決めておかなければいけません。

さて文字列変数の長さというものは重要で短く設定しすぎれば、文字切れを発生させ、長く設定しすぎれば無駄でしかなく、パフォーマンスの低下を招きます。

デォルトの200というのは中々、いい感じの設定で、そうそう文字切れしないし
obs数によりますが、そこまで大きすぎもせずといった線で、
普段、長さを意識しなくとも何の不自由もなく文字列関数を使っている方も多いかも
しれません。

しかし、例えば、医薬系であれば、各VISITごとのコメントデータを連結したり、
ある有害事象に対する処置詳細をカンマ連結で1変数に連結する処理など、油断していると
200を超えてくることがあります。
また、その変数のとりうる幅の最大値が予測できている場合など、長さが最大10程度にしか
ならないところに200を当てるのはパフォーマンスの無駄使いになります。
長さの無駄使いは巨大なデータセットになればなるほど無視できない問題です。

前置きが長くなりすぎました。とにかく長さはデフォルトに任せず、細かく設定した方がいいです
という話です。で、そういった処理の必要が生じた箇所を見逃さないように、

options msglevel=i;

を今回も使いましょうという話でした。
もうmsglevel=i、溺愛してます。普及させたいんです。デフォルト設定にしてほしいです。

今、以下のデータセットがあったとします。

data Q1;
 X='abcde';
run;

それを使って以下のコードを実行します。

data A1;
 set Q1;
  X2=tranwrd(X,'a','f');
  X3=repeat(X,2);
  X4=scan(X,2,'b');
run;

すると結果は以下のようになります。




で、proc contentsで変数情報を見てみると

proc contents data=A1;
run;










のように全てX2-X4の長さは200になっています。

次にoptions msglevel=i;を実行してから
同じようにコードを実行してみます。
そしてログを見てみると



となってどの変数で長さ200が設定されたかを教えてくれます。
ご丁寧に「結果が切り捨てられるかもしれません」と心配までしてくれます。

options msglevel=n;

で元に戻せます。


0 件のコメント:

コメントを投稿