我要实现以下目标:
我有两个桌子。其中一个表(Table_one)具有称为“句子”的列。 其值如下:
SENTENCE
I live in New York
A bad day
A very good day
我还有另一个表(Table_two),其中的一列名为“文本”,形式为:
TEXT
New York
good day
very good day
我希望将“文本”中的短语与“句子”中的句子匹配,以查看它们是否包含在任何“句子”观察中。我想输出那些确实包含文本的句子。
我知道这本身并不困难,但是我有一个独特的案例,就是我无法在线找到太多信息。
我想要的是一个结果表:
MATCH
I live in New York
A very good day
A very good day
我尝试了以下代码:
proc sql;
create table match as
select a.* from table_one as a, table_two as b
where find(a.Sentence, b.Text)>0
;
run;
我得到的是以下结果:
MATCH
I live in New York
A very good day
换句话说,由于Table_two中的观察结果:“ good day”和“ very good day”都包含在Table_one:“ A very good day”的句子中,因此将其视为单个观察结果,并且仅返回一次在输出中。
但是我希望两个短语都像个人观察一样对待,并像我期望的输出一样输出两次。
我尝试了FIND()和INDEX()函数。 但是两者都给我相同的结果。
无论是否在同一句子中有短语,总有没有避免一次观察结果输出并获得两个单独的观察结果?
任何帮助将不胜感激。
答案 0 :(得分:1)
不确定不请求结果时为什么会得到不同的结果。您可能遇到长度可变的问题,或者需要find子字符串的TRIM
以下示例显示了使用trim
时所需的查询结果。
data phrases;
length sentence $200;
input; SENTENCE = _infile_; datalines;
I live in New York
A bad day
A very good day
data terms;
length text $30;
input; text = _infile_; datalines;
New York
good day
very good day
run;
proc sql;
create table match as
select
phrases.*, text as matched_on
from
phrases, terms
where
find(phrases.Sentence, trim(terms.Text))>0
;
quit;
删除, text as matched_on
,结果中将得到相同数量的行
答案 1 :(得分:0)
如果我理解正确,这应该可以为您提供所需的东西。如果找到匹配项,则在每个SENTENCE中搜索TEXT,然后停止查找。
data SENTENCE;
input sentence $80.;
cards;
I live in New York
A bad day
A very good day
;;;;
run;
data text;
infile cards eof=eof;
input text $80.;
return;
eof:
call symputx('obs',_n_-1);
cards;
New York
good day
very good day
;;;;
run;
%put NOTE: &=obs;
data found;
if _n_ eq 1 then do;
array txt[&obs] $80 _temporary_;
do i = 1 to dim(txt) while(not eof);
set text end=eof;
txt[i]=text;
end;
end;
set sentence;
do i = 1 to dim(txt);
if find(sentence,txt[i],1,'T') then do;
text=txt[i];
output;
leave;
end;
end;
drop i;
run;
proc print;
run;