我輩はブロガーではない。ネタもまだない

SASとかDelphiあたりの人様の役に立たないネタを提供します

cexist関数の注意点

sasにはcexist関数という、カタログの存在チェックを行う関数が用意されています。

通常の記述方法はこんな感じです。

data _null_;
  if cexist("SASカタログ名") then do;
    /* カタログがあるときの処理 */
  end;
run;


単発実行してもいいのですが、簡単なマクロを作成しました。

%Macro MCatcheck(cat);
  data _null_;
    if cexist("&cat.") then do;
      put "&cat.はありまぁす";
    end;else 
    do;
      put "&cat.がみつかりません";
    end;
  run;
%Mend;

このマクロを以下の環境でこのマクロを実行するとどうなるでしょうか。
f:id:japelin:20200110180228p:plain


実は最後の1つだけ見つからない、となります。
f:id:japelin:20200110180246p:plain
エクスプローラには表示されているのに。

これは裏でファイルを削除したとかそういう問題ではなく、カタログが読めないことによる問題です。


現在、WindowsSASには32bit版と64bit版があり、SASデータセットについては互換性がありますが、実はカタログについては互換性がありません。

そうです、これは、32bit版のSASで実行しましたが、読めないカタログは64bit版SASで作成されたものでした。

cexist関数は単に「sas7bcat」を見ているのではなく、カタログにアクセスできるかどうか、までチェックしているようです。
32bitから64bitに移行しているケースが増えていると思いますが、そんな時はご注意を。

基本的にはcport、cimportプロシージャで変換ができますがマクロカタログは再度マクロを実行しなければなりません。
(32bit版SASでcport、64bit版SASでcimportが必要なので注意)

分かっていれば大したことではないんですがね。