【问题标题】:SAS Index on Array阵列上的 SAS 索引
【发布时间】:2016-11-14 17:44:27
【问题描述】:

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

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;

【问题讨论】:

  • 当然,它会遍历数组的所有条目,因为这是你告诉它要做的。你想让它做什么?如果找到匹配项,您是否希望提前退出循环?
  • 糟糕,编辑了代码,我的剪贴板中一定有旧版本。我有一个做直到而不是做。

标签: string sas do-loops datastep


【解决方案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;

【讨论】:

  • 所以这部分工作,但它仍然不匹配(我检查了这些字段,它们肯定有关键字)。当我不删除 i 和 last i 时,每一行都有 46 和 47 作为值。
  • 所以你的问题真的是如何使用 INDEX() 函数?很可能您的 KEYWORDS 短于 30 个字符,因此它们不匹配,因为额外的空格不在 DESCR 变量值中。添加 TRIM() 或使用 FINDW() 等其他函数。
  • 修剪做到了!非常感谢。
【解决方案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;

这里有两件事要看。首先,注意对while 的添加。这保证了我们永远不会尝试匹配“”(如果您的字符串中有任何空格,它将始终匹配)。第二个是find 中的t 选项(我注意到你必须添加1 作为起始位置,因为某种原因,替代版本至少对我不起作用)它从两个参数中修剪空格。否则它会寻找“auto”而不是“auto”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    相关资源
    最近更新 更多