数组上的 SAS 索引

SAS Index on Array

我正在尝试在描述字段 (descr) 中搜索关键字,如果存在,则将该字段定义为匹配项(它匹配的关键字并不重要)。我遇到一个问题,do 循环遍历数组的所有条目和 .我不确定这是因为我的 do 循环不正确还是因为我的索引命令不正确。

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]  _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;

向您的 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]  _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;

你有两个问题;这两者在一个紧凑的小例子中都很容易看到(建议:以后在你的问题中放一个这样的例子)。

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

data master;
  input @1 description .;
  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".