ユーザ定義フォーマットのUTF-8セッションエンコーディング環境への移行

[OS]
[リリース] 9.2, 9.3, 9.4
[キーワード] SAS PROC FORMAT CNTLIN CNTLOUT

[質問]

今までは、SASをセッションエンコーディングSJISで使用していました。
セッションエンコーディングUTF-8の環境で使用することになり、データセットのトランスコードは行っておりますが、ユーザ定義フォーマットのトランスコードはどのようにすればよいでしょうか。

[回答]

フォーマットカタログにつきましては、エンコーディングの概念がございません。
他方、PROC FORMATでは、CNTLIN=, CNTLOUT=オプションを用いて、ユーザ定義フォーマットの情報をデータセットに出力することが可能です。
一度、データセットに出力した後、トランスコードすることができます。

1) SAS SJISセッションエンコーディングで、制御データセットの作成

LIBNAME sjisfmt  "c:¥temp¥sjisfmt"; 

/** サンプルフォーマットの作成 **/ 
PROC FORMAT LIB=work; 
   VALUE testfmt 
   1="男"; 
RUN; 

/** CNTLOUT=にて、制御データセット化 **/ 
PROC FORMAT LIB=work CNTLOUT=sjisfmt.cntlout; 
RUN; 

2) SAS UTF-8セッションエンコーディングにて、制御データセットのカスタマイズ、再作成

LIBNAME sjisfmt "c:¥temp¥sjisfmt" CVPMULT=1.5 INENCODING=sjis; 

/** 1)で作成した制御データセットをWORK.FORMATSに取り込む **/ 
PROC FORMAT CNTLIN=sjisfmt.cntlout LIB=work; 
RUN;

/** 再度、制御データセットとして、出力 **/ 
PROC FORMAT CNTLOUT=work.cntlout LIB=work; 
RUN;

/** ここで、SJIS->UTF-8に変更する上で、日本語の長さの変更がある     **/ 
/** (今回の例では、"男"が2->3バイトになる **/ 
/** フォーマットの中では、フォーマット値の長さ、フォーマット値を   **/ 
/** 指定しない場合のデフォルトの長さの情報も含まれている           **/ 
/** 制御データセット内では、変数 LENGTH、DEFAULTがそれぞれ該当     **/ 
/** する。DEFAULTはSJISで作成した際の長さとなっているため、LENGTH  **/ 
/** と同じ値にする **/ 

DATA work.cntlout2; 
  SET work.cntlout; 
  DEFAULT=length; 
RUN; 

/** カスタマイズした制御データセットをフォーマットカタログに取り込む **/
PROC FORMAT CNTLIN=work.cntlout2 LIB=work; 
RUN; 

/** 結果の確認 **/
DATA _null_;
   a=1;
   PUT a testfmt.;
RUN;