String SAS-通过重复输出从不同表中的句子中检索匹配文本

String SAS-通过重复输出从不同表中的句子中检索匹配文本,string,sas,String,Sas,我想实现以下目标: 我有两张桌子。其中一个表(表1)有一列称为“句子”。 其值如下所示: SENTENCE I live in New York A bad day A very good day 我有另一个表(表2),其中有一列名为“Text”,其形式如下: TEXT New York good day very good day 我想将“文本”中的短语与“句子”中的句子进行匹配,看看它们是否包含在任何“句子”观察中。我想输出那些包含文本的句子 我知道这本身并不困难,但我有一个独特的案例,

我想实现以下目标:

我有两张桌子。其中一个表(表1)有一列称为“句子”。 其值如下所示:

SENTENCE
I live in New York
A bad day
A very good day
我有另一个表(表2),其中有一列名为“Text”,其形式如下:

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
换言之,由于表二“good day”和“very good day”中的观察结果都包含在表一“A very good day”的句子中,因此将其视为单个观察结果,并在输出中仅返回一次

然而,我希望这两个短语都能像个人观察一样对待,并像我期望的输出一样输出两次

我已经尝试了FIND()和INDEX()函数。 但两者都给了我相同的结果

即使同一句话中有短语,是否仍可以避免单一观察输出,并获得两个单独的观察结果


任何帮助都将不胜感激

如果我理解正确,这会给你想要的。在找到匹配项时搜索每个句子中的文本并停止查找

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;

不知道为什么当你没有要求时,你会得到不同的结果。您可能存在可变长度问题,或者需要查找子字符串的
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;

删除,文本匹配_on,结果中的行数相同

FIND有一个修饰符t或t修剪字符串和子字符串的尾随空格。这解决了我的问题!我从可能有唯一编码的数据集中读取输入。正如@Richard所提到的,罪犯是可变长度相关的。使用TRIM()函数修复了该问题。非常感谢您指出了正确的解决方案!非常感谢您调查这个问题!我试过这个代码,它确实给了我想要的。但上面的答案是一个简单得多的解决办法。但再次感谢你们的努力!