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

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

SAS UNICODE版での注意

よくUnicodeデータセットを読むときには、libnameステートメントでcvpオプションを指定して文字列サイズを拡張する必要がある、なんて言いますけど、別のエラーにぶち当たりました。


以下のコードはSAS日本語版で実行できるものです

data _null_;
  a='28apr2021'd;
  put a yymmdd10.;
  put a jdateymd14.;
  put a jnengo16.;
run;

2021/4/28を3種類のフォーマットで出力しています。
結果は以下のとおりです。
f:id:japelin:20210428122627p:plain


これを、SAS Unicode版で実行するとどうなるでしょうか。

f:id:japelin:20210428122637p:plain
エラーになりました。
幅が無効って言われちゃってます。


コメントアウトして実行してみると…
f:id:japelin:20210428122646p:plain

今度はjnengoフォーマットで「日」が出力されていません



これはちゃんと理由があって、日本語、つまりいわゆるダブルバイト文字は1文字2バイトというのが今までの常識でした。
しかしUNICODEでは、1文字3バイト(一部4バイト)のため、フォーマットの長さも変更する必要があります。

具体的には以下のように
jdateymdは年月日の3文字が含まれているため、3バイトを増やした17.に、
jnengoは年号、年月日の5文字が含まれているため、5バイト増やした21.にします。

data _null_;
  a='28apr2021'd;
  put a yymmdd10.;
  put a jdateymd17.;
  put a jnengo21.;
run;


f:id:japelin:20210428122658p:plain
これで正しく出力されました。


移行した後にjdateymdのようにエラーで止まってくれればいいんですが、jnengoのように、尻切れのようになってしまうと怖いですね。