Как сканировать строку и динамически конвертировать в 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),' '' -. ')
- find (str, scan (str, 2, '-'): находит начальную позицию второго слова.
- find (str, scan (str, -1, '-'): находит начальную позицию последнего слова.
- step2 - find (str, scan (str, 2, '-')) - 1: найти конечную позицию второго последнего слова (длина текста для копирования).
- Функция перевода: заменяет '-' на '.'
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