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


2010年5月19日水曜日

Twitterのアイコンを作ってみました。

NIでも以前からTwitterを始めていますが、先日アイコンを作ってみました。

アイコン変えてみました。less than a minute ago via HootSuite



ま、デザインのセンスはさておき、興味のある方はどんどんフォローしてください。
当ブログのサイドバーにもつぶやきを自動表示させています。

ちなみに、↑のTwitterのつぶやきを表示しているのは、Blackbird PieというWebサービスです。


投稿者:@massu_NI


2010年5月17日月曜日

DDEを利用したEXCEL表読込みのTips

DDEを利用したEXCELの表を取り込む際に
表の行数が何行になっても対応できる方法です。

まず下のような表があり、赤枠の部分を読込みたいとします。



この表をDDEで取り込む場合通常は以下のようにfilenameステートメントを記述します。

filename myxls dde "Excel|[Book1]Sheet1!R2C1:R3C3";

data test;
infile myxls;
input name $ sex $ age;
run;

無事にデータセット化できました。


では下の図のように表に値が追加されていった場合はどうすればよいでしょうか。
filenameの記述を毎回書き換えるのは少し面倒ですよね。


こういう場合はfilenameステートメントを次のように記述しておきます。

filename myxls dde "Excel|[Book1]Sheet1!C1:C3";

R1C1参照の部分を以下のように変更しています。

R2C1:R3C3

C1:C3


SASデータセットに取り込むプログラムは次のように変更します。

data test;
infile myxls firstobs=2;
input name $ sex $ age;
run;

firstobs=2を追加していますね。

無事にデータセット化することが出来ました。



R1C1形式の指定をカラム情報のみにすると指定したカラム範囲の全てのデータを対象にします。
(firstobs=2を追加したのは表の項目ラベルも対象範囲にはいってしまうためです)
こうしておく事でデータが随時追加されていく表に対しても
プログラムの変更なく取り込むことが出来ますので、覚えておくと便利です。

おわり


投稿者:@miya_NI


2010年5月7日金曜日

マニュアル

マニュアルによる管理は、多くの人に短時間で一定レベルの仕事をさせようとする際とても有効な手段である。
一方でイレギュラーケースに弱く、仕事に対する意識の低下を招きやすい。

毎朝のミーティングで、30秒トークという時間を設けている。その中でこんな話があった。
「夕食後の皿洗いを手伝った際、肉の脂がべっとりとこびり付いていたので、お湯で流してから洗ったらほとんど洗剤を使わずにきれいになった・・・・」
30秒程度で自由に話す内容ではあるけれど、とても考えさせる話だった。

皿洗いは手段。その目的は皿をきれいにすることである。
皿洗いという行為を知らない人に皿洗いという仕事を教える時、あなたならどんな指示を出すだろう。

A.スポンジに洗剤をつけて皿の表裏を3回以上なでた後、水ですすいで
B.使用済みの皿をきれいにすることが君の仕事だ。これまでこんな方法できれいにしてきたが、より良い方法を考えて実践してほしい。

皿洗いを長いこと続ける時、その作業を限定的に捉えるか大本の目的を達成するための1つの手段と捉えるかで得られる結果は大きく変わってくる。
A、Bそれぞれの方法を何年も繰り返し引き継いでいったとしたら・・・。
 
実際の職場では、マニュアルと目的の共有は併用されていることがほとんどだとは思う。
けれど、忙しい現場が増員を図った時など、目先の指示出しに終始し手戻りが多いと感じることはないか?
そう感じたらそれは目的の共有という基本に戻るためのチャンスだ。

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

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