У меня есть следующая цель, которую я хочу выполнить:

У меня две таблицы. В одной из таблиц (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: «хороший день» и «очень хороший день» содержатся в предложении Table_one: «Очень хороший день», оно рассматривается как одно наблюдение и возвращается только один раз в выводе. ,

Однако я хотел бы, чтобы обе фразы рассматривались как отдельные наблюдения и выводились дважды, как и желаемый результат.

Я пробовал функции НАЙТИ () и ИНДЕКС (). Но оба дают одинаковые результаты.

Есть ли способ избежать вывода одного наблюдения и получить два отдельных наблюдения, даже если в одном предложении есть фразы?

Любая помощь была бы очень признательна.

1
Vinay Ashokkumar 8 Окт 2018 в 17:24

2 ответа

Лучший ответ

Не уверен, почему вы получаете отчетливые результаты, когда их не запрашиваете. У вас могут быть проблемы с переменной длиной или вам потребуется 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
Richard 8 Окт 2018 в 16:18

Если я правильно понимаю, это должно дать вам то, что вы хотите. Искать ТЕКСТ в каждом ОТПРАВЛЕНИИ, если и когда найдено совпадение, вывести и прекратить поиск.

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;
0
data _null_ 8 Окт 2018 в 15:44