在SAS SQL中计算电子邮件地址中的连续辅音

时间:2016-06-23 13:31:20

标签: email sas email-validation pattern-recognition proc-sql

我想使用SAS SQL(proc sql)确定电子邮件地址中连续辅音和元音的最大数量。输出应该类似于下面的连续辅音Max和连续元音的最大值(我在第一行中列出的字符仅用于说明目的)。

有几点需要注意:

  • 将特殊字符和数字字符视为计数终止符(例如,第3封电子邮件就是一个很好的例子,你有3个辅音(hf),然后是数字(98),然后是2个辅音(jl)。输出应该只有2(hf)。

  • 我只对电子邮件的第一部分感兴趣(在@之前)。

亲爱的社区,我如何实现这一目标?

<!-- File One -->
<input type="hidden" name="options[designFile]" id="hiddenFile" value="{{ item.options['designFile'] }}">
<span class="results"></span>

<!-- File Two -->
<input type="hidden" name="options[designFile]" id="hiddenFile" value="{{ item.options['designFile'] }}">
<span class="results"></span>

<!-- File Three -->
<input type="hidden" name="options[designFile]" id="hiddenFile" value="{{ item.options['designFile'] }}">
<span class="results"></span>

3 个答案:

答案 0 :(得分:4)

有一个名为max_value = raw_input('Enter maximum value:') inte = int(max_value) range_of_values = range(inte) 的例程在这里证明非常方便。

生成样本数据

prxnext

进行点算

data emails;
  input email $32.;
  datalines;
asifhajhtysiofh@gmail.com
chris.nashfield@hotmail.com
ahf98jla@gmail.com
;

结果

data checkEmails(keep = email maxCons maxVow);
  set emails;

  * Consonants;
  re = prxparse("/[bcdfghjklmnpqrstvwxyz]+/");
  start = 1;
  stop = index(email,"@");
  do until (pos = 0);
    call prxnext(re,start,stop,email,pos,len);
    maxCons = max(maxCons, len);
  end;

  * Vowels;
  re = prxparse("/[aeiouy]+/");
  start = 1;
  stop = index(email,"@");
  do until (pos = 0);
    call prxnext(re,start,stop,email,pos,len);
    maxVow = max(maxVow, len);
  end;
run;

答案 1 :(得分:0)

这比我预期的要复杂得多,但我有一个使用宏循环的解决方案,大致遵循@ DaBigNikoladze评论中的逻辑:

list

答案 2 :(得分:0)

我不确定为什么要为此任务指定proc sql。数据步骤更加合适,因为您可以遍历电子邮件,将非辅音或非元​​音的所有内容视为分隔符。我使用了正则表达式(prxchange)删除了电子邮件的@部分,尽管substr同样适用。

data have;
input Email $50.;
datalines;
asifhajhtysiofh@gmail.com
chris.nashfield@hotmail.com
ahf98jla@gmail.com
;
run;

data want;
set have;
length _w1 _w2 $50;
_short_email=prxchange('s/@.+//',-1,email); /* remove everything from @ onwards */
do _i = 1 by 1 until (_w1=''); /* loop through email, using everything other than consonants as the delimiter */
    _w1 = scan(_short_email,_i,'bcdfghjklmnpqrstvwxyz','ki');
    consonant = max(consonant,ifn(missing(_w1),0,length(_w1))); /* keep longest value */
end;
do _j = 1 by 1 until (_w2=''); /* loop through email, using everything other than vowels as the delimiter */
    _w2 = scan(_short_email,_j,'aeiou','ki');
    vowel = max(vowel,ifn(missing(_w2),0,length(_w2))); /* keep longest value */
end;
drop _: ; /* drop temprorary variables */
run;