我想使用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>
答案 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;