顶者有分!!! 200 分 求 存储过程  ---- 分拣电子邮件

awash 2008-08-22 04:30:10
说明:
1。电子邮件保存在ms sql数据库中。

1) 该数据库有三张表,表结构和字段名称完全相同

t_email 保存电子邮件
t_duplicate 保存重复邮件
t_error 保存错误邮件

2) 表结构如下:
CREATE TABLE [dbo].[t_email] (
[email] [nvarchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
[company] [nvarchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
[name] [nvarchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
[country] [nvarchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
[category] [nvarchar] (255) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

3)需要分拣的电子邮件保存在email字段

4)t_email表中的记录有100万条。


2。存储过程的功能要求:
1)如果首尾有空字符,要求清除空字符
例如将 " sea@abc.tv " 处理为 "sea@abc.tv"
2)有大量重复邮件地址。要求将重复的记录复制到t_duplicate表中,并在原t_email表中删除该条记录。
3)邮件域名不一定是.com, .net 之类结尾。域名来自世界各地,例如 ".it", ".ae", ".se"等。
4)如果不是合法的电子邮件,则将该条记录复制到t_error表中,并在原t_email表中删除该记录。
5)合法电子邮件只能有字母或数字开头,可以包含英文的下划线字符,英文的中划线字符,英文句号字符。

合法邮件的样式:
XXX@xxx.xxx

例如,以下3个均为合法邮件
john.lee@mn.rr.cn
john-lee@test-rr.com
john_lee@mn.rr.com.ar

以下这些不是合法邮件
john-lee@test_rr.com (邮件用户名可以有下划线,但域名不能有下划线)
-@vega-montage.dk
OFIT@ZAHAV.COM.ILI


6)不是每一行都有地址的,有不少记录的email字段是空的(<null>)。则将该条记录复制到t_error表中,并在原t_email表中删除该记录。
7)最后,t_email中剩下的数据,都是清洗过的记录。


3。待清洗的电子邮件存在不少错误,包括:
1)有特殊字符,例如 “/”,分号,中文字符等。
例如:capelec.sarl@wanadoo.fr/GREGORY.CLADERA@CAPELEC.FR

类似的情况还有:
a)lhysc@ms34.hinet.net;ysclh@hotmail.com
b) narumon.chaim@paka.com <narumon.chaim@paka.com>
c) g_naseeb@hotmail.com或 naseeb@emirates.net.ae

等等,不胜枚举。 这些记录,一律复制到t_error表中


2)非法邮件地址,这样的地址,将该条记录复制到t_error表。例如:邮件“OFIT@ZAHAV.CO.ILI”

3)无符号连写
例如: plasticzar@aol.comoralice@advanceplastics.com
这里实际是两个邮件地址,中间有一个 or,这样的地址,将该条记录复制到t_error表。

再例如:unicus@attbi.comORchristienshen@attbi.com
这里也是两个地址,中间也是有一个 “or”。
再例如:mini_94@hotmail.com.fernandojc2@hotmail.com.fernandojc2@bigpond.com

这样的地址,将该条记录复制到t_error表。

4)有可能是完全没有@字符,例如 braunsberger.at,或者 "1234"这样的数字或一些英文字串。这样的记录,将该条记录复制到t_error表






以下是一段email范例:

capelec.sarl@wanadoo.fr/GREGORY.CLADERA@CAPELEC.FR

amen@amenwardy.com
amen@amenwardy.com
amen@amenwardy.com
amrit_quilt_centre@hotmail.com
junquett@quadrifoglio.com.br
842234
callas@artshoppe.net
hello world
flyingsnow368@yahoo.com.cn   
beechworthwine@yahoo.com   
mini_94@hotmail.com.fernandojc2@hotmail.com.fernandojc2@bigpond.com
clive8116@yahoo.com.vivianbol@hotmail.com
info@homenoffice.com.pk;mozzi@cyber.net.pk
bilalzady@hotmail.com&waji@netvigator.com
jwu@classicpkg.com/jbcindustries@shaw.ca
francisco@leadermagazine.com.br,makeasy@imagelink.com.br
mina_stl@hotmail.comormina_stl@yahoo.com
LPahssen@mn.rr.comorLLPMARK@aol.com
carolt@sharich.com, chugani@sharich.com, sunder@sharich.com 
lhysc@ms34.hinet.net;ysclh@hotmail.com
narumon.chaim@paka.com <narumon.chaim@paka.com>
g_naseeb@hotmail.com或 naseeb@emirates.net.ae
<null>
~~~~~
"michael@dfgifts.com" or "john@dfgifts.com"
agroquimlahuerta@prodigy.net.mx
@. 
-.-@amer.fi 
#AHMED_ENP@YAHOO.COM 
//Carol.Taylor@Geest.co.uk 
-@vega-montage.dk 
863-3015@HANMAIL.NET 
1@profitebor.com
amen@amenwardy.com
OFIT@ZAHAV.CO.ILI
amen@amenwardy.com


清洗结果如下:

1。保留在t_email表中的有

amen@amenwardy.com
amrit_quilt_centre@hotmail.com
junquett@quadrifoglio.com.br
callas@artshoppe.net
flyingsnow368@yahoo.com.cn
beechworthwine@yahoo.com
agroquimlahuerta@prodigy.net.mx
863-3015@HANMAIL.NET
1@profitebor.com


2。保存在t_duplicate表中的有

amen@amenwardy.com
amen@amenwardy.com
amen@amenwardy.com
amen@amenwardy.com
(该邮件重复出现5次,故其中4条记录被复制到t_duplicate表中)


3。保存在t_error表中的有

capelec.sarl@wanadoo.fr/GREGORY.CLADERA@CAPELEC.FR

842234
hello world  
mini_94@hotmail.com.fernandojc2@hotmail.com.fernandojc2@bigpond.com
clive8116@yahoo.com.vivianbol@hotmail.com
info@homenoffice.com.pk;mozzi@cyber.net.pk
bilalzady@hotmail.com&waji@netvigator.com
jwu@classicpkg.com/jbcindustries@shaw.ca
francisco@leadermagazine.com.br,makeasy@imagelink.com.br
mina_stl@hotmail.comormina_stl@yahoo.com
LPahssen@mn.rr.comorLLPMARK@aol.com
carolt@sharich.com, chugani@sharich.com, sunder@sharich.com
lhysc@ms34.hinet.net;ysclh@hotmail.com
narumon.chaim@paka.com <narumon.chaim@paka.com>
g_naseeb@hotmail.com或 naseeb@emirates.net.ae  
<null>
~~~~~
"michael@dfgifts.com" or "john@dfgifts.com"
@. 
-.-@amer.fi 
#AHMED_ENP@YAHOO.COM 
//Carol.Taylor@Geest.co.uk 
-@vega-montage.dk 
OFIT@ZAHAV.CO.ILI
...全文
747 71 打赏 收藏 转发到动态 举报
写回复
用AI写文章
71 条回复
切换为时间正序
请发表友善的回复…
发表回复
awash 2008-09-08
  • 打赏
  • 举报
回复
结了,多谢大家关注!特别是Herb2 !!!
Herb2 2008-09-01
  • 打赏
  • 举报
回复
if patindex('[0-9a-zA-Z]%',@y)<>1   return 23
if patindex('%^[0-9a-zA-Z.-_]%',@y)>0 return 24
if patindex('[0-9a-zA-Z]%',@d)<>1 return 25
if patindex('%^[0-9a-zA-Z.-]%',@d)>0 return 26

===>
if patindex('[0-9a-zA-Z]%',@y)<>1   return 23
if patindex('%[^0-9a-zA-Z.[-[_]%',@y)>0 return 24
if patindex('[0-9a-zA-Z]%',@d)<>1 return 25
if patindex('%[^0-9a-zA-Z.[-]%',@d)>0 return 26
Herb2 2008-09-01
  • 打赏
  • 举报
回复
  if patindex('[0-9a-zA-Z]%',@y)<>1   return 23
if patindex('%^[0-9a-zA-Z.-_]%',@y)>0 return 24
if patindex('[0-9a-zA-Z]%',@d)<>1 return 25
if patindex('%^[0-9a-zA-Z.-]%',@d)>0 return 26

==>
  if patindex('[0-9a-zA-Z]%',@y)<>1   return 23
if patindex('%[^0-9a-zA-Z.[-[_]%',@y)>0 return 24
if patindex('[0-9a-zA-Z]%',@d)<>1 return 25
if patindex('%[^0-9a-zA-Z.[-]%',@d)>0 return 26
Herb2 2008-09-01
  • 打赏
  • 举报
回复
create function getemail(@m varchar(8000))
returns int
as
begin
declare @mm varchar(8000),@y varchar(8000),@d varchar(8000)
declare @i int
if @m is null return 21
select @mm = rtrim(ltrim(@m))
select @i = charindex('@',@mm)
if @i < 2 return 22
select @y=right(@mm,@i),@d = left(@mm,len(@mm)-@i)
if patindex('[0-9a-zA-Z]%',@y)<>1 return 23
if patindex('%^[0-9a-zA-Z.-_]%',@y)>0 return 24
if patindex('[0-9a-zA-Z]%',@d)<>1 return 25
if patindex('%^[0-9a-zA-Z.-]%',@d)>0 return 26
if (select count(*) from mail where rtrim(ltrim(mm))=@mm)>1 return 1
return 0
end
go

create table mail(mm varchar(100))
insert mail
select '842234'
union all select 'amen@amenwardy.com'
union all select 'amrit_quilt_centre@hotmail.com '
union all select 'junquett@quadrifoglio.com.br '
union all select 'callas@artshoppe.net '
union all select 'flyingsnow368@yahoo.com.cn '
union all select 'beechworthwine@yahoo.com '
union all select 'beechworthwine@yahoo.com '
union all select 'agroquimlahuerta@prodigy.net.mx '
union all select '863-3015@HANMAIL.NET '
union all select '863-3015@HANMAIL.NET '
union all select '1@profitebor.com '
union all select '1@profitebor.com '
union all select '1@profitebor.com '
union all select '1@profitebor.com '
union all select 'hello world'
union all select 'mini_94@hotmail.com.fernandojc2@hotmail.com.fernandojc2@bigpond.com '
union all select 'clive8116@yahoo.com.vivianbol@hotmail.com'
union all select 'info@homenoffice.com.pk;mozzi@cyber.net.pk'
union all select 'bilalzady@hotmail.com&waji@netvigator.com'
union all select 'jwu@classicpkg.com/jbcindustries@shaw.ca '
union all select 'francisco@leadermagazine.com.br,makeasy@imagelink.com.br '
union all select 'mina_stl@hotmail.comormina_stl@yahoo.com '
union all select 'LPahssen@mn.rr.comorLLPMARK@aol.com '
union all select 'carolt@sharich.com, chugani@sharich.com, sunder@sharich.com '
union all select 'lhysc@ms34.hinet.net;ysclh@hotmail.com '
union all select 'narumon.chaim@paka.com <narumon.chaim@paka.com> '
union all select 'g_naseeb@hotmail.com或 naseeb@emirates.net.ae   '
union all select '~~~~ '
union all select '"michael@dfgifts.com" or "john@dfgifts.com" '
union all select '@.  '
union all select '-.-@amer.fi  '
union all select '#AHMED_ENP@YAHOO.COM  '
union all select '//Carol.Taylor@Geest.co.uk  '
union all select '-@vega-montage.dk  '
union all select 'OFIT@ZAHAV.CO.ILI'
go
set nocount on
select dbo.getemail(mm),* from mail order by dbo.getemail(mm)

go
drop table mail
drop function getemail
/*
mm
----------- ----------------------------------------------------------------------------------------------------
0 agroquimlahuerta@prodigy.net.mx
0 mini_94@hotmail.com.fernandojc2@hotmail.com.fernandojc2@bigpond.com
0 clive8116@yahoo.com.vivianbol@hotmail.com
0 info@homenoffice.com.pk;mozzi@cyber.net.pk
0 bilalzady@hotmail.com&waji@netvigator.com
0 jwu@classicpkg.com/jbcindustries@shaw.ca
0 francisco@leadermagazine.com.br,makeasy@imagelink.com.br
0 mina_stl@hotmail.comormina_stl@yahoo.com
0 LPahssen@mn.rr.comorLLPMARK@aol.com
0 carolt@sharich.com, chugani@sharich.com, sunder@sharich.com
0 lhysc@ms34.hinet.net;ysclh@hotmail.com
0 narumon.chaim@paka.com <narumon.chaim@paka.com>
0 junquett@quadrifoglio.com.br
0 callas@artshoppe.net
0 flyingsnow368@yahoo.com.cn
0 amen@amenwardy.com
0 OFIT@ZAHAV.CO.ILI
1 beechworthwine@yahoo.com
1 beechworthwine@yahoo.com
1 863-3015@HANMAIL.NET
1 863-3015@HANMAIL.NET
1 1@profitebor.com
1 1@profitebor.com
1 1@profitebor.com
1 1@profitebor.com
22 hello world
22 ~~~~
22 842234
22 @. 
23 -.-@amer.fi 
23 #AHMED_ENP@YAHOO.COM 
23 amrit_quilt_centre@hotmail.com
23 g_naseeb@hotmail.com或 naseeb@emirates.net.ae  
25 "michael@dfgifts.com" or "john@dfgifts.com"
25 //Carol.Taylor@Geest.co.uk 
25 -@vega-montage.dk 


*/
ab5669 2008-08-31
  • 打赏
  • 举报
回复
看的晕,顶一下。
lijtom 2008-08-31
  • 打赏
  • 举报
回复
学习。
不得闲 2008-08-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ybkenan 的回复:]
頂貼接分
[/Quote]
bobui 2008-08-31
  • 打赏
  • 举报
回复
主张用正则表达式过滤
bobui 2008-08-31
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 Herb2 的回复:]
SQL codecreate function getemail(@m varchar(8000))
returns int
as
begin
declare @mm varchar(8000),@y varchar(8000),@d varchar(8000)
declare @i int
if @m is null return 2
select @mm = rtrim(ltrim(@m))
select @i = charindex('@',@mm)
if @i < 2 then return 2
select @y=right(@mm,@i-1),@d = left(@mm,len(@mm)-@i)
if patindex('[0-9a-zA-Z]',@y)<>1 then return 2
if patindex('…
[/Quote]
bobui 2008-08-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 HEROWANG 的回复:]
太长,头晕
[/Quote]
bing110 2008-08-31
  • 打赏
  • 举报
回复
呵呵,帮忙顶一下!
jaksuse 2008-08-29
  • 打赏
  • 举报
回复
up
angelior 2008-08-29
  • 打赏
  • 举报
回复
你肯定要分步的。

写这么长。

还不如写出你要实现的技术点。

如,

1)如果首尾有空字符,要求清除空字符
例如将 " sea@abc.tv " 处理为 "sea@abc.tv"
2)有大量重复邮件地址。要求将重复的记录复制到t_duplicate表中,并在原t_email表中删除该条记录。

这两个答为:
1) Ltrim 和 RTrim 函数就可
2)insert into t_duplicate (email) select distinct email from t_email 就可

....
wxg22526451 2008-08-29
  • 打赏
  • 举报
回复
up
hyde100 2008-08-29
  • 打赏
  • 举报
回复
友情帮顶
wgzaaa 2008-08-29
  • 打赏
  • 举报
回复
今天老大们都在,把问题说说清楚。
rock_LL 2008-08-29
  • 打赏
  • 举报
回复
顶一顶
好难啊!
KermitYue 2008-08-28
  • 打赏
  • 举报
回复
up
lijtom 2008-08-28
  • 打赏
  • 举报
回复
学习。能力达不到。
lff642 2008-08-28
  • 打赏
  • 举报
回复
友情帮顶
加载更多回复(51)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧