如何扫描字符串并在SAS中动态转换

时间:2018-03-13 21:12:39

标签: sas substr

假设我有两个字符串可以从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 个答案:

答案 0 :(得分:2)

有点长的路,但这对我来说很好。

  • 使用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), ".", "-");
    

答案 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 ;)

  1. find(str,scan(str,2,&#39; - &#39;):找到第二个的起始位置 字。
  2. find(str,scan(str,-1,&#39; - &#39;):找到最后的起始位置 字。
  3. step2 - find(str,scan(str,2,&#39; - &#39;)) - 1:找到第二个结束位置 最后一个字(要复制的文字长度)。
  4. 翻译功能:替换&#39; - &#39;与&#39;。&#39;
  5. 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