2017年5月7日日曜日

文字列の検索いろいろ:INDEX関数編



文字列の検索に使えるINDEX系の関数を紹介。



INDEX、INDEXC、INDEXW関数

シングルバイト(半角の英数など)の文字を対象とする場合、上記3つの関数を状況によって使い分ける。


例を見てみましょう。

data DT1;
     A  = "abc,def,ghi" ;
     B  = index( A , "bc" );
     C  = indexc( A , "ae" );
     D  = indexw( A , "def" , "," );
run;
  A  
  B  
  C  
   
  abc,def,ghi    2  1  5

解説
INDEX( A , "bc")
第2引数の "bc" という文字列が変数Aの何バイト目に見つかったかを返す。
(見つからなかった場合は0を返す。)

INDEXC( A , "ae" )
第2引数の "ae"を一字ずつ分解し、"a"または"e"という文字が変数Aの何バイト目に見つかったかを返す。
(見つからなかった場合は0を返す。)

INDEXW( A , "def" , ",")
第3引数にカンマ「","」を指定しているので、変数Aはカンマ区切りで単語が格納されていると解釈されます。
つまり変数Aの「abc,def,ghi」は「abc」「def」「ghi」という3つの単語があると解釈される。
そしてこの3つの単語のうち、第2引数の「def」と完全一致する単語が5バイト目に見つかったことを表しています。

注意点
日本語などの文字を含む場合は、以下記事の通りうまく動作しないのでご注意ください。
関数の落とし穴:5C問題


KINDEX、KINDEXC関数

マルチバイト(日本語などの全角文字など)を含む文字を対象とする場合、頭に”K”がつく上記2つの関数を使います。

data DT2;
  A = "あいうえお";
  B = kindex(A,"うえ");
  C = kindexc(A,"あお");
run;
  A  
  B  
  C  
  あいうえお    3  1

解説
KINDEX( A , "うえ")
第2引数の "うえ" という文字列が変数Aの何文字目に見つかったかを返す。
(見つからなかった場合は0を返す。)

KINDEXC( A , "あお" )
第2引数の "あお"を一字ずつ分解し、"あ"または"お"という文字が変数Aの何文字目に見つかったかを返す。
(見つからなかった場合は0を返す。)


重要なポイント
頭に"K"の付く関数とそうでない関数の違いとして、、
INDEX系関数は何バイト目に見つかったかを返すのに対し、
KINDEX系関数は何文字目に見つかったかを返します。


覚え方
種類いっぱいあって覚えらんないですよね。一応私の覚え方ですが、

・INDEXC の ”C” は Character(一字)のC?
・INDEXWの ”W” は Word (単語)のW?

検索方法を表しているんでしょうかね。
CとWの略は私がそう思ってるだけで実際のとこは分かりません。

0 件のコメント:

コメントを投稿