options validvarname=anyでSASの変数命名規則を無視して、日本語の変数名とか作っちゃう話

受け取ったSASデータセットが開けない。
繰り返されるよくある話で、原因はいろいろ咲き乱れですが、
ログやエラーメッセージからだいたい原因はわかります。

フォーマットをロードできないとかでてたら、フォーマット参照の指定を忘れていたらfmtsearchで
指定。フォーマットがなぜかないならnofmterrでとりあえず開けます。
OS等、プラットフォームの違いによるものであればCPORTプロシジャでカタログ移送形式に変換して
からデータを貰って、CIMPORTで戻しましょう。


実は最近、SASデータセットを受け取って、そこからWORKにコピーしようとしたら














とメッセージがでて、移動できなかったんですね。
ダブルクリックで開こうとしても同じメッセージが出て、ログには何もでませんでした。
あれ、このパターンはなんだっけ??

メッセージの意味もよくわかりませんでした、列1が無効なSAS名??
しばらく考えて、あ、もしかしてと思って

options validvarname=any;

としてから、そのデータセットを開いてみると





となっていました。
この「列1」というのラベルじゃなくて、ガチで変数名です。
つまり、

data Q1;
列1='い';列2='ろ';列3='は';output;
run;

のようなデータセットで、なんと変数名に日本語が使われていたのです。
そんな特殊なデータセット送ってこないでよ、、。

validvarname=anyを使うと、SASの変数名に対する命名規則が適用されなくなり
日本語だろうがなんだろうが変数名にしてコードがかけるようになります。

ただ、普通はそんなことしません。他のシステムとの兼ね合い等でどうしても
命名規則に反する変数名を使う必要がある時ぐらいでしょうか?
まあ、乱暴な方法として、libnameでheader=yesの状態でエクセルにデータをアウトプットする
際に変数名を日本語にすることで、あたかもラベル出力したように見せかけたりできますが、
あんまり綺麗なことじゃないです。

options validvarname=V7;

で通常の命名規則になります。

あと、面白いのは
options validvarname=UPCASE;
ですかね。

このオプションが効いている状態で作成されたデータセットは
たとえ以下のように

data A;
x=1;
run;

小文字で変数名を書いて、実行しても
勝手に大文字に変更されます。





これはオプションを解除しても大文字のままです。

使いどころとしては最終的なデータセットの変数名が
大文字に統一されていることが必ず必要な場面であれば、
最後のステップでこのオプションをつけて作成すればいいですね。
まあ最初から宣言しててもいいですけど。

0 件のコメント:

コメントを投稿