さんざん、マニアックなところを紹介しているのに、PRX系関数に一切触れないのはどうしてですか?というご質問をいただきました。
正直、痛いところを突かれたと思いました。
軽んじているわけではなく、まだ練習中で、あまり詳しくないからです。
ただ、PRX?という方もいらっしゃると思うので簡単な例だけ紹介します。
詳しくは「SAS Perl Regular Expressions」や「SAS 正規表現」で検索していただければ
よっぽど丁寧で詳細な資料がたくさん見つかるので、そちらで勉強してください。
正規表現は、乱暴にざっくりいうと文字のパターンマッチングのことです。
特にPerlというプログラミング言語に実装されている正規表現の書き方が、イケてる?ので
それに準じた機能をSASの関数にしましたよというのが、PRX関数です。
以前「whereステートメントでのみ使用できる演算子_contains,between,like」
http://sas-tumesas.blogspot.jp/search/label/like
でlike演算子を紹介しました。「
where X like '_B_D%' ;」のようにアンダースコアや%を使って、
文字のパターンを表現して、それにマッチしたものを抽出するといった機能でした。
感じとしては、これのゴージャス版です。
data Q1;
length X $20.;
X='123-xx';output;
X='12-xx';output;
X='423-XZ';output;
X='423_XZ';output;
X='000000 123-yy';output;
X='123-xy 123-xy 123-xy';output;
run;
ここでXの値に 数字3個の次にハイフンがきてその後 x か z か yの文字が2個続く
という特定のパターンが出現するかどうかを調べなければならないとします。
以下のコードと実行結果を見てください
data A1;
set Q1;
Y=PRXMATCH('/¥d{3}-[x-z]{2}/',X);
run;
まずPRXMATCH関数は、正規表現で指定したパターンが、対象変数のどの位置で
最初に出現するかを数字で返す関数です。0であれば、対象変数に指定したパターンは出現していないということです。
/¥d{3}-[x-z]{2}/ が正規表現の部分です。なんとなくわかるかもしれませんが¥d{3}が数字3個
-はそのままハイフン、[x-z]{2}がxかyかzが2個という部分に対応しています。
今は結果はYという変数に割り当てましたが、要はこれをIFステートメントに指定すれば
パターンでオブザベーションの抽出ができるわけです。
他にたくさん記号や書き方があるので、そこを勉強すれば、相当柔軟なマッチングができるわけです。
ちなみに
data A2;
set Q1;
Y=PRXMATCH('/¥d{3}-[x-z]{2}/i',X);
run;
とすると、大文字小文字の違いが不問化され
となります。
ちなみにただ、一致した位置を返すだけがSAS Perl正規表現ではありません。
以下のプログラムと結果をみてください
data A3;
set Q1;
Y1=PRXCHANGE('s/23-/いろ/',1,X);
Y2=PRXCHANGE('s/23-/いろ/',2,X);
Y_1=PRXCHANGE('s/23-/いろ/',-1,X);
run;
これは変数の中に出現する、「23-」というパターンを「いろ」という文字列に置き換える処理です。
置換にはPRXCHANGE関数と正規表現の部分の/前にsをつけます。
第2引数は、見つかったパターンの何個目まで置換対象にするかという数字です。
ここを-1にすると、1個だろうが100個だろうが、全部置き換えるという処理になります。
多分、ここまでで、なんかこれって、もっと凄い柔軟で複雑なテキスト処理ができるんじゃないか?
と感じていただければ幸いです。
正規表現を極めれば、対テキストデータのプロになれます。
多分テキストマイニング等をされる方は、使う方多いんではないでしょうか?
/*追記*/
コメントにて、とても大切なテクニックについてご教示いただきました。有難うございます!