数组上的 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".
我正在尝试在描述字段 (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".