假设我有两个字符串可以从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;
答案 0 :(得分:2)
有点长的路,但这对我来说很好。
使用TRANSLATE()将 - 转换为句点。
z=find(str, '-');
end=find(strip(reverse(str)), '-');
string = translate(substr(str, z+1, length(str) - z - end), ".", "-");
答案 1 :(得分:0)
正则表达式可以匹配短划线定界数字序列。提取后的匹配可以使用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;
如果仅数字标记序列前面有以数字结尾的标记,或者以数字开头的标记成功,则会出现时髦的情况。
答案 2 :(得分:0)
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;
答案 3 :(得分:0)
您可以在一行中执行此操作。使用subtr将文本保留在第二个单词和最后一个单词之间:
<强>翻译(SUBSTR(STR,发现(STR,扫描(STR,2,&#39; - &#39)),发现(STR,扫描(STR,-1,&#39; - &#39;)) - 发现(STR,扫描(STR,2,&#39; - &#39;)) - 1),&#39;&#39;&#39; - &#39 ;)强>
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