如何使用substring函数获取SAS中单词的最后一部分?

时间:2015-01-08 14:54:26

标签: sas

我有一个我想要编辑的电子邮件列表。我最后收到了很多电子邮件,比如@ institution.dk。我要删除的所有这些类型的电子邮件。左边的字符数量相同,所以我必须从右到左识别电子邮件。

我试过了:

data B;
set a;
where var not equals 'institution.dk';
run;

data B;
set a;
where var equals not 'institution.dk';
run;

data B;
set a;
where substr(var,-1,14^= 'institution.dk';
run;

data b;
set a;
var2=scan(trim(var),-1,14) ;
run;
data c;
set b;
if var2 ^= institution.dk;   
run;

但没有任何作用。如何让SAS识别字符串的最后一部分(从右到左依次计数),以便删除这些观察结果?

2 个答案:

答案 0 :(得分:3)

扫描是正确的起点。电子邮件只能有一个' @',对吧?

email_account = scan(var,1,'@');
email_server = scan(var,2,'@');

现在您可以根据需要进行过滤。你不需要像上面那样的两个步骤:

data b;
  set a;
  length email_server $50;
  email_server = scan(var,2,'@');
  if email_server ne 'institution.dk';
run;

data b;
  set a;
  where scan(var,2,'@') ne 'institution.dk';
run;

在SQL / WHERE中也有一个有用的LIKE运算符(但不是IF或其他SAS数据步骤元素)。 '%'这里是通配符。

data b;
  set a;
  where not (var like '%@institution.dk');
run;

答案 1 :(得分:0)

一种方式是索引:

If index(var,"@institution.dk") then delete;

另一种方法是使用正则表达式:

If prxmatch("#\@institution.dk#",var) then delete;

另一种更有用的方法可能是使用呼叫扫描:

Call scan(var,-1,pos,len,"@");
Var2=substr(var,pos);
If var2="institution.dk" then delete;

第1行为@后的最后一个单词创建pos和len变量,第2行创建包含该信息的变量var2,第3行测试它是否与要排除的字符串匹配,如果返回为真则删除。