Как создать макропеременную, потребляющую данные из другого набора данных, заменяя из / в? - PullRequest
0 голосов
/ 15 мая 2019

Я ищу способ замены строки набора данных 1, используя содержимое набора данных 2.

У меня есть поле "Адрес" в наборе данных 1:

data dataset;
infile datalines;
input Address  $ B $;
datalines;
Indonesia St 
Canada Av near from USA St
Japan St
Cingapure Av
;
run;

У меня есть набор данных, который будет использоваться как FROM / TO:

data dataset;
infile datalines;
input A  $ B $;
datalines;
St Street
Av Avenue
;
run;

Я ожидаю, что получится что-то вроде этого:

Indonesia Street
Canada Avenue near from USA Street
Japan Street
Cingapure Avenue

Кто-нибудь знает, как я могу это решить?

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Техника, которую вы выбираете, частично зависит от количества обрабатываемых адресов и количества возможных замен.

Вместо зацикливания потенциальных замен, рассматривая зацикливание на словах исходного текста.

По существу:

  • Для каждого слова адреса
  • Поиск слова для замены
  • Объединить слово / слово-замену обратно в преобразованный адрес

У каждого процесса есть несколько возможностей

  • Сканирование
  • prxmatch / prxnext

Процесс поиска имеет множество возможностей

  • поиск хеша
  • пользовательский формат
  • слияния
  • осталось присоединиться

Процесс объединения имеет несколько возможностей

  • || оператор конкатенации
  • функция catx

Пример одной реализации:

data addr; input; length address $100;
address = _infile_;
datalines;
Indonesia St 
Canada Av near from USA St
Japan St
Cingapure Av
;
run;
data map;
infile datalines;
input source $ destin $;
datalines;
St Street
Av Avenue
;
run;

data want;
  if 0 then set map;

  if _n_ = 1 then do;
    declare hash lookup(dataset: 'map');
    lookup.defineKey('source');
    lookup.defineData('source', 'destin');
    lookup.defineDone();
  end;

  set addr end=lastrecord;

  length altaddr $100;

  do index = 1 to countw(address);
    word = scan(address,index);

    if length(word) <= lengthm(source) then do;

      if 0 = lookup.find(key:trim(word))
        then altaddr = catx(' ', altaddr, destin);
        else altaddr = catx(' ', altaddr, word);

    end;
    else
      altaddr = catx(' ', altaddr, word);
  end;

  * address = altaddr;

  drop source destin index word;
run;
0 голосов
/ 15 мая 2019

Самое простое решение этой проблемы - которое имеет много возможных - это использовать набор данных from / to в качестве таблицы перевода.

Кстати, это не тривиальная проблема; это довольно сложно, когда у вас есть много возможных изменений. Вы также получите некоторые ложные срабатывания, когда вы измените что-то, что не должно было быть изменено, если у вас нет очень четко определенного текста (почти наверняка у вас нет).

Но в конечном итоге вы можете попытаться сделать что-то вроде этого:

data want;
  set have;  *your address dataset;
  do _n_ = 1 to nobs_trans;
    set trans point=_n_ nobs=nobs_trans;  *your from/to dataset;
    address = tranwrd(address,from,to);
  end;
run;

Это не совсем правильно, но это скелет того, что вы хотите сделать. Это также совсем не быстро ; Вы, вероятно, захотите сделать что-то быстрее, и если вы хотите сделать это, вам нужно провести исследование альтернативных подходов к этому алгоритму.

...