2014年2月25日火曜日

FORMATプロシジャで正規表現を使う。


「SAS9.3」から、
FORMATプロシジャのINVALUEステートメント内で、正規表現が使えるようになりました。

INVALUEはインフォーマットを作成するステートメントです。

正規表現は詳しくない、、ので詳細は割愛します。。
だけど面倒な置換などが簡単に出来るので、別記事で紹介したいです。


構文

proc  format;
   invalue  インフォーマット名
       ' 正規表現 '  (regexp)  =  表示値
       ・
       ・
       ・
   ;
run;

「(regexp)」と書くことで、正規表現ですよ、と宣言してます。


サンプルプログラム

*** サンプルデータ作成 *****;
data DT1;
  input V1$;
cards;
ad
ca
fd
;
run;

*** INVALUEステートメントに正規表現を使った例 *****;
* ① ***;
proc format;
  invalue MYFMT1_
    '/[abc]{2}/'  (regexp) = 1
    '/[def]{2}/'  (regexp) = 2
    other = 3
  ;
run;

* ② ***;
data DT2;
  set DT1;
  V2 = input(V1, MYFMT1_.);
run;

データセット「DT2」
V1  V2
ad   3
ca   1
fd    2



解説

①まず正規表現を含むINVALUEステートメントを定義します。
正規表現を使う場合、以下のように両端を「/」で囲みます。

'/[abc]{2}/'  (regexp) = 1

上記は、「a,b,c」のいずれかの2文字で構成されてる値だったら「1と表示する」と定義してます。

②INPUT関数でインフォーマットを指定して数値変換します。


応用例

「○時○分」と入力された文字データを時間値に変換する例。

*** 日本語時刻を時間値に変換するサンプルコード *********;
proc format;
   invalue   JPTM_
   's/(\d+)時(\d+)分/$1:$2/'  (regexpe)  =  [time5];
run;

data DT1;
   V1 = input("12時3分", JPTM_.) ;
run;


正規表現の醍醐味である置換処理と、こちら「FORMATプロシジャの小技」の合わせ技です。

正規表現で置換処理を表現するには以下のように書きます。
「's/ 置換対象の文字 / 置換後の文字 /'」

サンプルコードの
's/(\d+)時(\d+)分/$1:$2/'
では「○時○分」と書かれた文字を「○:○」に置換しています。

その後この置換文字に対して「time5.」で時間値に変換してます。


まとめ

応用例にあるような合わせ技は個人的にFORMATプロシジャで一番欲しい機能でした。
ちょっとうまく説明ができなかったけど、やってることは単純なので理解して実戦に組み込むことができれば、便利なテクニックです。

ただしSASでは現状、古いバージョンの正規表現が元になってるらしく、
全角文字に完全対応はしておらず、「こちら」で取り上げた5C問題なども原因で、思った結果がでないことがあります。

0 件のコメント:

コメントを投稿