如何在SAS中使用子字符串函数获取单词的最后一部分?

如何在SAS中使用子字符串函数获取单词的最后一部分?,sas,Sas,我有一个要编辑的电子邮件列表。我有很多电子邮件,比如最后的@institution.dk。我想删除所有这些类型的电子邮件。左边的字符数没有相同的长度,因此我必须从右到左识别电子邮件 我试过: data B; set a; where var not equals 'institution.dk'; run; 及 及 及 但什么都不管用。如何让SAS识别字符串的最后一部分(从右到左计数),以便删除这些观察结果?开始扫描是正确的。电子邮件只能有一个“@”,对吗 email_account = sc

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

我试过:

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


但什么都不管用。如何让SAS识别字符串的最后一部分(从右到左计数),以便删除这些观察结果?

开始扫描是正确的。电子邮件只能有一个“@”,对吗

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;

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

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

一种方法是索引:

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行测试它是否匹配要排除的字符串,如果返回true则删除

data b;
  set a;
  where not (var like '%@institution.dk');
run;
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;