处理电子邮件地址列表的最佳方法

我有3个文本文件(A,B和C),每个文件有几百个电子邮件地址。 我想将列表A和列表B合并成一个文件,忽略大小写和空格的区别。 然后,我想删除列表C中新列表中的所有电子邮件,并再次忽略大小写和空格的差异。

我select的编程语言通常是C ++,但似乎不太适合这个任务。 有没有一种脚本语言可以在相对较less的几行中做到这一点(以及类似的任务)?

还是有已经在那里的软件(免费或商业),让我这样做? 例如,Excel中可以这样做吗?

最快的方法可能不一定需要编码。 您可以在一个工作表中将文件A和B导入到Excel中,然后(如有必要)对结果列表中的地址进行过滤,以删除任何重复项。

下一步是将文件C导入到第二个工作表中。 在第三个工作表中,您将执行一个VLOOKUP来挑选第一个列表中的所有地址,如果它们在“列表C”中,则将其删除。

VLOOKUP看起来像这样:

= IF(ISNA(VLOOKUP( email_address_cell ,Sheet2! email_duplicates_list ,1,false),“”,(VLOOKUP( email_address_cell ,Sheet2! email_duplicates_list ,1,false)))

我还包括一个检查,看看公式是否返回一个“价值不可用”的错误,在这种情况下单元格显示一个空白值。 从那里,你只需要删除你的空白,并有你的最终名单。

现在说了这么多,你仍然可以做一个VBAmacros做同样的事情,但也许根据你需要清理一下列表。 希望有所帮助!

对于你所描述的types的文本处理来说,perl或者python是理想的。

您可以使用关联数组(在这种情况下,具有string索引的数组)将电子邮件地址存储在列表中。

使用小写,无空格的电子邮件地址作为密钥,并将真实的电子邮件地址作为值。

然后读入和存储第一个文件,读入和存储第二个文件(这将用相同的密钥覆盖电子邮件地址),然后读取第三个文件并用该关键字从列表中删除条目。

你留下的是你想要的清单(A + B – C)。

伪代码在这里:

set list to empty foreach line in file one: key = unwhitespace(tolowercase(line)) list{key} = line foreach line in file two: key = unwhitespace(tolowercase(line)) list{key} = line foreach line in file three: key = unwhitespace(tolowercase(line)) if exists(list{key}) delete list{key} foreach key in list: print list{key} 

正如Excel提到的,你也可以用Jet和VBScript来做这种事情。

 Set cn = CreateObject("ADODB.Connection") strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Docs\;" _ & "Extended Properties=""text;HDR=No;FMT=Delimited"";" cn.Open strCon strSQL = "SELECT F1 Into New.txt From EmailsA.txt " _ & "WHERE UCase(F1) Not IN (SELECT UCase(F1) From EmailsC.txt)" cn.Execute strSQL strSQL = "INSERT INTO New.txt ( F1 ) SELECT F1 FROM EmailsB.txt " _ & "WHERE UCase(F1) Not IN (SELECT UCase(F1) From EmailsC.txt)" cn.Execute strSQL 

在Python中,像这样的东西:

请注意,这会将小写邮件写入最终输出。 如果这不好,那么基于字典的解决scheme将是必要的。

 def read_file(filename): with file(filename, "r") as f: while True: line = f.readline(); if not line: break; line = line.rstrip(); if line: yield line; def write_file(filename, lines): with file(filename, "w") as f: for line in lines: f.write(line + "\n"); set_a = set((line.lower() for line in read_file("file_a.txt"))); set_b = set((line.lower() for line in read_file("file_b.txt"))); set_c = set((line.lower() for line in read_file("file_c.txt"))); # Calculate (a + b) - c write_file("result.txt", set_a.union(set_b).difference(set_c)); 

我想上面的答案,回答技术如何问题; 唯一需要考虑的是你需要执行多less次任务。 如果这是一次性的事情,而且您更喜欢使用Excel,请从这里开始。 如果你知道你至less要执行两次或者更多的任务,那么编写一个脚本或者可执行文件是最好的select。

可悲的是,这个答案可能不会帮助你,但是如果你实际上使用的是Unix(例如Linux),你可以这样做:

cat filea >> fileb#追加文件a到文件b

sortingfileb | uniq> newFile#newFile现在包含文件a和文件b的合并,以及sorting和唯一的电子邮件地址

以上都可以在一行上完成,如下所示:cat filea >> fileb | sorting| uniq> newFile

现在,您只需删除常见的电子邮件即可。 “差异”的一些变化应该是有帮助的,比如:diff newFile file> finalFile

diff会给你两个文件之间的差异列表,所以“finalFile”中的输出应该是在“newFile”(A&B合并)但不在fileC中的电子邮件列表。 各种工具的选项允许你忽略空白和大小写。 为了让它完全正确,我必须稍微玩一下,但以上是一般的想法。

我曾经有一个额外的机器运行Linux,其目的只是为了完成像Windoze一样的麻烦,但是在Unixtypes的操作系统下却是一件轻而易举的事情。 当我的硬件死亡时,我从来没有去build立另一个Linux的盒子。

我相信Windoze的MKS工具包可能具有上述所有的function。

Excel可以做到这一点,如上所述。 最适合的编程语言是Perl。