2016-11-14 65 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”。