【问题标题】:The best way to process lists of email addresses处理电子邮件地址列表的最佳方式
【发布时间】:2010-09-21 13:23:24
【问题描述】:

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

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

或者是否已经有软件(免费或商业)可以让我这样做?例如,是否可以在 Excel 中完成?

【问题讨论】:

    标签: excel list scripting merge


    【解决方案1】:

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

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

    VLOOKUP 看起来像这样:

    =IF(ISNA(VLOOKUP(email_address_cell, Sheet2!email_duplicates_list, 1, false), "", (VLOOKUP(email_address_cell em>, Sheet2!email_duplicates_list, 1, false)))

    我还检查了公式是否返回“值不可用”错误,在这种情况下,单元格只显示一个空白值。从那里,你只需要删除你的空白,然后你的最终列表就出来了。

    现在说了这么多,您仍然可以使用 VBA 宏来做很多相同的事情,但可能会稍微清理一下列表,这取决于您的需要。希望对您有所帮助!

    【讨论】:

    • 这如何解决空格和大小写要求。
    • 什么要求?我们想忽略大小写差异(Excel 默认会这样做)和空格。诚然,使用上述建议您会得到一些空白行,但可以使用另一个自动过滤器轻松删除它们。
    【解决方案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】:

      对于您描述的那种文本处理,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}
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我认为上面的答案,回答技术HOW TO问题;唯一需要考虑的是您必须执行多少次任务。如果这是一次性的事情,并且您对 Excel 更满意,请从那里开始。如果您知道您将执行此任务至少两次甚至更多次,那么编写脚本或可执行文件是您的最佳选择。

          【讨论】:

            【解决方案6】:

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

            cat filea >> fileb # 将文件 a 附加到文件 b

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

            以上都可以在一行中完成,如下所示: 猫文件a >> 文件b |排序 | uniq > 新文件

            现在您只需删除常用电子邮件即可。 “差异”的一些变体在那里应该会有所帮助,例如: diff newFile 文件C > finalFile

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

            我曾经有一个额外的机器运行 Linux,其唯一目的是执行上述操作,这在 Windoze 下很麻烦,但在 Unix 类型的操作系统下轻而易举。当我的硬件死机时,我再也没有时间构建另一个 Linux 机器。

            我相信适用于 Windoze 的 MKS 工具包可能具有上述所有实用程序。

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2020-02-14
                • 1970-01-01
                • 1970-01-01
                • 2017-07-23
                • 2011-11-11
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多