SAS RegEx извлечение строк - PullRequest
       19

SAS RegEx извлечение строк

0 голосов
/ 09 апреля 2020

У меня есть вектор строк, где в каждом наблюдении есть куча случайного текста. Например:

  "SOLAR MARS T-1500S TURBINE (13,300-BHP, NG, CENTRIFUGAL)"
  "13-A, C-B, 1350 HP, NATURAL GAS COMPRESSOR ENGINE"
  "3,000HP KVT-512 ENGINE"
  "Engine 1, Caterpillar G3512 TALE : Emission Point:"
  "DRESSER RAND - 2SLB ENGINE 1 RATED AT 3,200 BHP"
  "Clark Engine #1 - 1550 HP natural gas-fired SI 2SLB"
  "E1 - s/n WPW-01669 JJJJ""

Я пытаюсь извлечь значения лошадиных сил (любое число 4-5 пять ди git, за которым следует либо «BHP», либо «HP»). Обратите внимание, что некоторые наблюдения не имеют никакого значения HP. В конечном итоге я хочу вернуть следующее:

  13,330-BHP
  1350HP
  3,000HP
  .
  3,200 BHP
  1550 HP
  .

У меня нет большого опыта использования Regex в SAS. У кого-нибудь есть идеи, как это сделать?

Спасибо

1 Ответ

2 голосов
/ 09 апреля 2020

Преобразование комментария @Zachary Haber в код.

Сначала преобразуйте текст в фактический набор данных SAS.

data have;
  input string $80.;
cards;
SOLAR MARS T-1500S TURBINE (13,300-BHP, NG, CENTRIFUGAL)
13-A, C-B, 1350 HP, NATURAL GAS COMPRESSOR ENGINE
3,000HP KVT-512 ENGINE
Engine 1, Caterpillar G3512 TALE : Emission Point:
DRESSER RAND - 2SLB ENGINE 1 RATED AT 3,200 BHP
Clark Engine #1 - 1550 HP natural gas-fired SI 2SLB
E1 - s/n WPW-01669 JJJJ
;

Теперь прочитайте этот набор данных и используйте CALL PRXNEXT (), чтобы найти первый матч Добавлен код для преобразования результата в число.

data want;
  set have;
  if _n_=1 then regexid = prxparse('(\d+(,\d+)*[ -]*?B?HP)');
  retain regexid;
  drop regexid;
  length want $40;
  start=1;
  stop=length(string);
  call prxnext(regexid,start,stop,string,position,len);
  want=substrn(string,position,len);
  HP = input(compress(want,',- BHP'),??32.);
run;

Результат:

Obs       want         HP     string

 1     13,300-BHP    13300    SOLAR MARS T-1500S TURBINE (13,300-BHP, NG, CENTRIFUGAL)
 2     1350 HP        1350    13-A, C-B, 1350 HP, NATURAL GAS COMPRESSOR ENGINE
 3     3,000HP        3000    3,000HP KVT-512 ENGINE
 4                       .    Engine 1, Caterpillar G3512 TALE : Emission Point:
 5     3,200 BHP      3200    DRESSER RAND - 2SLB ENGINE 1 RATED AT 3,200 BHP
 6     1550 HP        1550    Clark Engine #1 - 1550 HP natural gas-fired SI 2SLB
 7                       .    E1 - s/n WPW-01669 JJJJ
...