データセット(.sas7bdatファイル)の文字コードを取得したい - SAS

SAS環境の違いにより、SASのデータセットの文字コードが混在することがまれによくあると思います。 データセットの文字コードがSAS環境に合っていないと、文字化けが起きてしまいますし、パフォーマンスが低下してしまうので、きちんと環境に合わせる必要があります。 文字コード変換をしなくてはいけないデータセットってどれだろうと一括で調べるための準備として、データセットの文字コードを取得してマクロ変数に格納できるようになるまでが今回のお話です。

ちなみに、文字コードがSAS環境の文字コード(セッションエンコーディング)と合っていないと、下記のようなログメッセージが出て怒られます。

 59         data TEST(encoding=sjis) ;
 60           A = 1 ;
 61         run ;
 
 INFO: 
 データファイルWORK.TEST.DATAに他のホストにネイティブな形式が使用されているか、またはエンコーデ
 ィングがセッションエンコーディングと一致していません。クロス環境データアクセスが使用され
 るため、追加のCPUリソースが必要となり、パフォーマンスが低下します。
 NOTE: データセットWORK.TESTは1オブザベーション、1変数です。
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.05 秒
       CPU時間            0.00 秒

さて、データセットの文字コード取得は、proc contentsを用いることで取得できます。しかし、リスト出力のままでは、出力結果をSASプログラム上で扱うことが出来ません。

そこで登場しますのが、ods output です。 ods output により、リスト出力した結果をデータセットとして取得することができます。

data TEST1 ;
  A = 1 ;
run ;

ods output attributes=DATASET_ENCODING ;
proc contents data=TEST1 ;
run ;
ods output close ;

proc contents で指定したデータセットの文字コードが格納されている属性情報 (attributes) をデータセット DATASET_ENCODING に格納しています。

今回は、データセット属性情報を取得していますが、ライブラリ情報が欲しい場合は directory、ソート情報であれば sortedby、変数のアルファベット順リストであれば variables など、プロシジャとほしい情報に応じて、いっぱい名前があります。ここの部分は、ODSテーブル名と呼ばれています。詳しい情報は、SASオンラインヘルプの ODS(Output Delivery System) ユーザガイドの付録にいっぱい書いてあります。

上記で作ったサンプルコードをマクロ化したのが、以下のコードです。指定のデータセットの文字コードを、指定した名前のマクロ変数に格納します。 (※言語環境によっては下記のコードでは文字コードを取得できないかと思います)

 60         %macro SET_DS_ENCODING(DSNAME, DS_ENCODING) ;
 61         
 62           %global &DS_ENCODING. ;
 63         
 64           ods output attributes=DATASET_ENCODING ;
 65           proc contents data=&DSNAME. ;
 66           run ;
 67           ods output close ;
 68         
 69           data _null_ ;
 70             set DATASET_ENCODING ;
 71             where LABEL1 = "エンコード" ;
 72             call symputx("&DS_ENCODING.", CVALUE1) ;
 73           run ;
 74         
 75         %mend SET_DS_ENCODING ;
 76         
 77         
 78         data TEST ;
 79           A = 1 ;
 80         run ;
 
 NOTE: データセットWORK.TESTは1オブザベーション、1変数です。
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.02 秒
       CPU時間            0.02 秒
       
 
 81         
 82         %SET_DS_ENCODING(TEST, MOJI_CODE) ;
 
 NOTE: PROCEDURE CONTENTS処理(合計処理時間):
       処理時間           0.20 秒
       CPU時間            0.19 秒
       
 NOTE: データセットWORK.DATASET_ENCODINGは10オブザベーション、7変数です。
 
 
 NOTE: データセットWORK.DATASET_ENCODINGから1オブザベーションを読み込みました。 
       WHERE LABEL1='エンコード';
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.00 秒
       CPU時間            0.01 秒
       
 
 83         
 84         %put &=MOJI_CODE ;
 MOJI_CODE=utf-8  Unicode (UTF-8)

こんな感じで、マクロ変数 MOJI_CODE にデータセットの文字コードを取得することができました。



参考サイト

  1. PROC CONTENTSのSHORTオプションはアイディア次第で役に立ちそう。| SAS忘備録
  2. ods output を知ったきっかけの記事です。

  3. SASでのトランスエンコーディングあれこれ。| The Nameless City
  4. データセットの文字コード変換(トランスエンコーディング)について、詳しい記事です。

コメント

このブログの人気の投稿

日付フォーマットでない文字項目をSAS日付に変換するときにログ出力されるメッセージを抑制したい - SAS

Linuxコマンド: date で◯か月前 / ◯か月後を取得するときの注意