String SAS-通过重复输出从不同表中的句子中检索匹配文本
我想实现以下目标: 我有两张桌子。其中一个表(表1)有一列称为“句子”。 其值如下所示: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 我想将“文本”中的短语与“句子”中的句子进行匹配,看看它们是否包含在任何“句子”观察中。我想输出那些包含文本的句子 我知道这本身并不困难,但我有一个独特的案例,
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()函数修复了该问题。非常感谢您指出了正确的解决方案!非常感谢您调查这个问题!我试过这个代码,它确实给了我想要的。但上面的答案是一个简单得多的解决办法。但再次感谢你们的努力!