如何通过删除字符串的最后两个字符来获取SAS中的子字符串

时间:2018-02-20 18:17:18

标签: function sas

我必须从给定的字符串中获取子字符串,以便最后两个字符从最终输出中消失。

我的数据:

Output

我的代码:

data test;
set myclass.department;
last_name=scan(name,2,',');
run;

请就此提出建议。

谢谢!

3 个答案:

答案 0 :(得分:0)

使用Length()计算字符串的长度,然后使用SUBSTR()函数和LENGTH() - 2,这是你想要的长度。

由于我没有在图片中输入您的数据,我使用的是您默认应该拥有的SASHELP.CLASS数据集:

data class;
set sashelp.class;

new_name = substr(name, 1, length(name)-2);
run;

proc print;
run;

答案 1 :(得分:0)

你很接近并且@Reeza关于在读取数据时修复数据的建议更合适,并且也使用她的长度声明。所有你错过的是substr功能

data test;
set myclass.department;
lastname= substr(scan(name,2),1, length(scan(name,2,' '))-2);
run;

如果您的数据格式相同,则可以使用prxchange,如下所示。

  data TEST;
  set myclass.department ;
  length  lastname $25;
   lastname= prxchange('s/(.+\s+)(.+)(.{2})/$2/', -1, trim(name));
  RUN;

答案 2 :(得分:0)

scan是提取应该是所需姓氏的第一步。第二步是删除姓氏的最后两个字母。

对于玩具数据的情况,您正在学习第一个概念,您可以假定某些清洁度(方式1.a)。您还应该了解程序数据向量(pdv)中发生的默认情况。学习某些功能的微妙的SAS功能也是有益的(方式2)

data want;
  set have;
  • 使用lastname提取scan()
    该变量的存储空间(即长度属性)将自动设置为与变量 name

    lastname = scan (name, 2, ',');
    
  • 使用substr提取

    删除姓氏的最后两个字符
    • 假设姓氏值总是超过2个字符

      * way 1.a;
      
      lastname = substr(lastname, 1, length(lastname)-2);
      
    • 处理'短'将导致way 1.a LOG的值
      NOTE: Invalid third argument to function SUBSTR at line ...

      * way 1.b - presume 'lastname' content takes precedence over `state;
      
      if length(lastname) > 2 
        then lastname = substr(lastname, 1, length(lastname)-2);
      
      * way 1.c - presume 'state' content takes precedence over `lastname`
      
      if length(lastname) > 2 
        then lastname = substr(lastname, 1, length(lastname)-2);
        else lastname = ' ';
      
  • 逐字消灭最后两个字符!

    * way 2 - substr() on the left hand side;
    
    substr(lastname, max(length(lastname)-1,1)) = ' ';
    
 run;