2010年5月26日水曜日

SAS v9.2とv9.1でのkindex関数の違いについて

v9.2 から kindex関数の仕様が変わりました。
v9.1とv9.2でのkindex関数の仕様の違い、またindex関数についても検証してみたいと思います。

まず、以下のプログラムを実行してみます。


data _NULL_;
    ni="ネイチャーインサイト";


    var1=kindex(ni, "ネイチャーインサイト"); * 検索文字列の前後に半角ブランクが無い時;
    var2=kindex(ni, " ネイチャーインサイト"); * 検索文字列の前に半角ブランクがある時;
    var3=kindex(ni, "ネイチャーインサイト "); * 検索文字列の後ろに半角ブランクがある時;
    var4=kindex(ni, " ネイチャーインサイト "); * 検索文字列の前後に半角ブランクがある時;


    length test $25;
    test="ネイチャーインサイト";


    var5=kindex(ni, test);

    put var1= / var2= / var3= / var4= / var5=;
run;


結果はこうなります。

▼v9.1の場合

var1=1
var2=0
var3=1
var4=0
var5=1
NOTE: DATA ステートメント 処理 (合計処理時間):
処理時間 0.00 秒
CPU 時間 0.00 秒



▼v9.2の場合

var1=1
var2=0
var3=0
var4=0
var5=0
NOTE: DATA ステートメント 処理 (合計処理時間):
処理時間 0.01 秒
CPU 時間 0.01 秒



var3, var5の結果が違っているのがわかります。

v9.1までのkindex関数は、検索文字である第2引数の後ろのブランクを削除した後に文字列検索をする動きになっています。
対して、v9.2からは第2引数の後ろのブランクを残したまま文字列検索を行います。

var5のパターンの場合でも、変数の長さが25バイト用意してあるため、"ネイチャーインサイト "という文字列として文字列検索を行い、アンマッチとなります。

以上の違いにより、v9.1とv9.2ではkindex関数の結果に違いが生じます。


ではindex関数はどうなっているのでしょうか。

以下のプログラムを実行してみます。


data _NULL_;
    ni="natureinsight";


    var1=index(ni, "nature");
    var2=index(ni, " nature");
    var3=index(ni, "nature ");
    var4=index(ni, " nature ");


    length test $25;
    test="nature";


    var5=index(ni, test);

    put var1= / var2= / var3= / var4= / var5=;
run;



結果はこうなります。

▼v9.1の場合

var1=1
var2=0
var3=0
var4=0
var5=0
NOTE: DATA ステートメント 処理 (合計処理時間):
処理時間 0.01 秒
CPU 時間 0.01 秒



▼v9.2の場合

var1=1
var2=0
var3=0
var4=0
var5=0
NOTE: DATA ステートメント 処理 (合計処理時間):
処理時間 0.01 秒
CPU 時間 0.01 秒



どちらも同じです。

v9.2からのkindex関数のように、第2引数の後ろのブランクを削除せずに文字列検索を行っているようです。

このように、v9.2より前のSASではindex関数とkindex関数では動きが異なっていたんですね。
v9.2からのkindex関数の仕様変更により、index関数と動きが統一され分かり易くなりました。

また、このv9.2からのkindex関数の仕様は、NLSCOMPATMODEで実行、またはシステムオプションに指定することで以前の仕様に戻すことができます。


投稿者:@hoshi_NI


0 件のコメント:

コメントを投稿

ネイチャーインサイト サイトリニューアル&NIBLOGの引っ越し

ご連絡が遅くなりましたが、 ネイチャーインサイトの際とがリニューアルしました。 https://www.n-insight.co.jp/ それに伴い、NIBLOGも引っ越しすることになりました。 https://www.n-insight.co.jp/niblog/ ...