2016-11-14 92 views
0

我試圖在描述字段(descr)中搜索關鍵字,如果它在那裏將該字段定義爲匹配(匹配的關鍵字不重要)。我遇到了一個問題,即do循環正在經歷數組和數組的所有條目。我不確定是否這是因爲我的循環不正確,或者因爲我的索引命令是孕育。陣列上的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()函數?很可能您的關鍵字短於30個字符,因此它們不匹配,因爲額外的空格不在DESCR變量值中。添加TRIM()或使用另一個函數(如FINDW())。 – Tom

+0

修剪做到了!非常感謝你。 –

0

你有兩個問題;這兩個都很容易在一個小的例子中看到(建議:在將來的問題中將這樣的例子放在你的問題中)。

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; 

這裏有兩件事要看。首先,注意除了while。這保證我們永遠不會匹配「」(如果你的字符串中有空格,它將永遠匹配)。第二個是find中的t選項(我注意到你必須添加1作爲開始位置,因爲某些原因,替代版本至少對我來說不起作用),它修改了兩個參數的空格。否則它會查找「auto」而不是「auto」。