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