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

How to use substring function to get last part of a word in 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 识别字符串的最后部分(从右到左计数),以便删除这些观察结果?

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

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

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

data b;
  set a;
  length email_server ;
  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;

一种方法是索引:

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 行测试它是否与您要排除的字符串匹配,如果匹配则删除 returns 为真。