我有一个我想要编辑的电子邮件列表。我最后收到了很多电子邮件,比如@ 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识别字符串的最后一部分(从右到左依次计数),以便删除这些观察结果?
答案 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行测试它是否与要排除的字符串匹配,如果返回为真则删除。