2016-11-14 19 views
0

説明フィールド(descr)でキーワードを検索しようとしていますが、そのフィールドが一致する場合は一致するキーワード(一致するキーワードは重要ではありません)を定義します。私はどこのループが配列とのすべてのエントリを通過している問題があります。 doループが間違っているか、indexコマンドが正しく動作していないため、これが正しいかわかりません。アレイ上のSASインデックス

data JE.KeywordMatchTemp1; 
    set JE.JEMasterTemp; 
    if _n_ = 1 then do; 
    do i = 1 by 1 until (eof); 
    set JE.KeyWords end=eof; 
    array keywords[100] $30 _temporary_; 
    keywords[i] = Key_Words; 
    end; 
    end; 
    match = 0; 
    do i = 1 to 100 until(match=1); 
    if index(descr, keywords[i]) then match = 1; 
    end; 
    drop i; 
run; 
+0

確かに、配列のすべてのエントリを処理しています。なぜなら、これはあなたがしたことです。あなたは何をしたいのですか?一致するものが見つかった場合は、途中でループを終了することを検討していますか? – Joe

+0

コードを編集して、クリップボードに古いバージョンがインストールされている必要があります。私はするよりもむしろ行う。 –

答えて

1

DOループに条件を追加して、一致するものが見つかると終了させます。配列内のエントリ数も覚えておいてください。また、INDEX()が正しく機能するようにしてください。

data JE.KeywordMatchTemp1; 
    if _n_ = 1 then do; 
    do i = 1 by 1 until (eof); 
     set JE.KeyWords end=eof; 
     array keywords[100] $30 _temporary_; 
     keywords[i] = Key_Words; 
    end; 
    last_i = i ; 
    retain last_i ; 
    end; 
    set JE.JEMasterTemp; 
    match = 0; 
    do i = 1 to last_i while (match=0) ; 
    if index(descr, trim(keywords[i])) then match = 1; 
    end; 
    drop i last_i; 
run; 
+0

これは部分的に機能しますが、まだ一致しません(私はフィールドをチェックしており、キーワードは間違いありません)。私は私と最後の私を落とさないと、すべての行は46と47の値を持っています。 –

+1

あなたの質問は本当にどのようにINDEX()関数を使用するのですか?ほとんどの場合、KEYWORDSは30文字よりも短く、余分なスペースがDESCR変数値にないため、一致しません。 TRIM()を追加するか、代わりにFINDW()のような別の関数を使用してください。 – Tom

+0

トリムでした!どうもありがとうございました。 –

0

2つの問題があります。どちらも小さなコンパクトな例では見やすいでしょう(提案:このような例をあなたの将来の質問に入れてください)。

data partials; 
    input keyword $; 
    datalines; 
home 
auto 
car 
life 
whole 
renter 
;;;; 
run; 

data master; 
    input @1 description $50.; 
    datalines; 
Mutual Fund 
State Farm Automobile Insurance 
Checking Account 
Life Insurance with Geico 
Renter's Insurance 
;;;; 
run; 

data want; 
    set master; 
    array keywords[100] $ _temporary_; 
    if _n_=1 then do; 
    do _i = 1 by 1 until (eof); 
     set partials end=eof; 
     keywords[_i] = keyword; 
    end; 
    end; 
    match=0; 
    do _m = 1 to dim(keywords) while (match=0 and keywords[_m] ne ' '); 
    if find(lowcase(description),lowcase(keywords[_m]),1,'t') then match=1; 
    end; 
run; 

ここでは2つのことを見てください。まず、whileに追加してください。これにより、 ""とマッチすることは絶対にありません(文字列にスペースがあれば常に一致します)。 2番目はtのオプションがfindです(何らかの理由で、少なくとも私にとっては何かの理由で、1を追加する必要があります)、両方の引数からスペースを削除します。それ以外の場合は、 "auto"の代わりに "auto"を探します。

関連する問題