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

时间:2008-11-09 23:26:48

标签: excel list scripting merge

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

我选择的编程语言通常是C ++,但它似乎不适合这项任务。是否有一种脚本语言可以在相对较少的行中执行此操作(以及类似的任务)?

或者是否有可以让我这样做的软件(免费或商业版)?例如,可以在Excel中执行此操作吗?

7 个答案:

答案 0 :(得分:3)

最快的方法可能不一定需要编码。您可以在一个工作表中将文件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)))

我还检查了公式是否返回“Value Not Available”错误,在这种情况下,单元格只显示一个空白值。从那里,你只需要移除你的空白区域,这就是你的最终名单。

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

答案 1 :(得分:2)

对于您描述的排序的文本处理,perl或python都是理想的。

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

使用小写的,非空白的电子邮件地址作为密钥,使用真实的电子邮件地址作为值。

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

你剩下的就是你想要的清单(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}

答案 2 :(得分:2)

正如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

答案 3 :(得分:1)

在Python中,类似这样:

注意,这会将小写电子邮件写入最终输出。如果那不行,那么就需要基于字典的解决方案。

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));

答案 4 :(得分:1)

我认为上面的答案,回答技术如何提问;唯一需要考虑的是你需要执行多少次任务。如果它是一次性的东西,你对Excel更熟悉,那就从那里开始吧。如果您知道自己将执行此任务至少两次甚至更多,那么编写脚本或可执行文件就可以了。

答案 5 :(得分:1)

可悲的是,这个答案可能对您没有帮助,但如果事实上您使用的是Unix(例如Linux),您可以执行以下操作:

cat filea>> fileb#append file a to file b

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

以上所有内容都可以在一行中完成,如下所示: cat filea>> fileb |排序| uniq> NEWFILE

现在你只需删除常见的电子邮件。 “差异”的一些变化应该有帮助,例如: diff newFile fileC> finalFile

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

我曾经有一个额外的盒子运行Linux,其唯一目的就是做上面这样的事情,这在Windoze下很麻烦但在Unix类型的操作系统下轻而易举。当我的硬件死了,我从来没有开始构建另一个Linux机箱。

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

答案 6 :(得分:0)

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