SAS-从具有重复输出的不同表格的句子中检索匹配的文本

时间:2018-10-08 14:24:24

标签: string sas

我要实现以下目标:

我有两个桌子。其中一个表(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()函数。 但是两者都给我相同的结果。

无论是否在同一句子中有短语,总有没有避免一次观察结果输出并获得两个单独的观察结果?

任何帮助将不胜感激。

2 个答案:

答案 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;