Как сканировать строку и динамически конвертировать в SAS

Предположим, у меня есть две строки для преобразования из имени программы SAS в номер таблицы.

Моя цель - конвертировать первый "f-2-2-7-5-vcb" в "2.2.7.5". И это должно быть сделано динамически. Как и для "f-2-2-12-1-2-hbd87q", это должно было быть "2.2.12.1.2".

Как это сделать?

data input; 
input str $ 1-20; 
datalines;
f-2-3-1-5-vcb
f-2-4-1-6-rtg
f-2-3-11-1-3-hb17
;
run;

data want;
 set input;
 Sub=compress(substr(str,3,length(str)),,'kd') ;
run;

4 ответа

Решение

Немного дольше, но это прекрасно работает для меня.

  • Используйте FIND(), чтобы найти первый '-'
  • Используйте REVERSE() и FIND(), чтобы найти последний '-'
  • Используйте SUBSTR() и metrics + math сверху, чтобы удалить первый и последний компоненты
  • Используйте TRANSLATE() для преобразования - в периоды.

     z=find(str, '-');
     end=find(strip(reverse(str)), '-');
     string = translate(substr(str, z+1, length(str) - z - end), ".", "-");
    
data input; 
input str $ 1-20; 
string=translate(prxchange('s/\w+?\-(.*)\-\w+/$1/',-1,strip(str)),'.','-');
datalines;
f-2-3-1-5-vcb
f-2-4-1-6-rtg
f-2-3-11-1-3-hb17
;
run;

Регулярное выражение может соответствовать только последовательности цифр, разделенных тире. При извлечении совпадение может быть преобразовано с помощью translate,

data input; 
input str $ 1-20; 

rx = prxparse ("/^.*?((\d+)(-\d+)*)/");

if prxmatch(rx,str) then do;
  call prxposn (rx,1,s,e);
  name = substr(str,s,e);
  name = translate(name,'.','-');
end;

datalines;
f-2-3-1-5-vcb
f-2-4-1-6-rtg
f-2-3-11-1-3-hb17
funky2-2-1funky
f-2-hb17
a2bfunky
;
run;

Причудливая ситуация возникает, если последовательности токена "только цифры" предшествует токен, заканчивающийся цифрами, или после него следует токен, начинающийся с цифр.

Вы можете сделать это в одну строку. Используйте subtr, чтобы сохранить текст между вторым словом и последним словом:

переводить (SUBSTR (ул, найти (ул, сканирование (ул, 2, '-')), найти (ул, сканирование (ул, -1, '-')) - найти (ул, сканирование (ул, 2," - ')) - 1),' '' -. ')

  1. find (str, scan (str, 2, '-'): находит начальную позицию второго слова.
  2. find (str, scan (str, -1, '-'): находит начальную позицию последнего слова.
  3. step2 - find (str, scan (str, 2, '-')) - 1: найти конечную позицию второго последнего слова (длина текста для копирования).
  4. Функция перевода: заменяет '-' на '.'

substr (str, step1, step3): копировать текст между вторым словом и вторым последним.

Код:

data want;
 set input;
 Sub=translate(substr(str,find(str,scan(str,2,'-')),find(str,scan(str,-1,'-'))-find(str,scan(str,2,'-'))-1),'.','-');
 put _all_;
run;

Выход:

str=f-2-3-1-5-vcb Sub=2.3.1.5
str=f-2-4-1-6-rtg Sub=2.4.1.6 
str=f-2-3-11-1-3-hb17 Sub=2.3.11.1.3 
Другие вопросы по тегам