【问题标题】:Comparing two documents比较两个文档
【发布时间】:2012-09-05 20:54:08
【问题描述】:

我有两个非常大的列表。它们最初都在 excel 中,但较大的一个是电子邮件列表(大约 160,000 封)以及其他信息,例如他们的姓名和地址等。较小的一个是只有 18,000 封电子邮件的列表。

我的问题是,从第一个文档中删除包含第二个电子邮件地址的所有 18,000 行的最简单方法是什么?

我在想正则表达式,或者我可以使用其他应用程序?我曾尝试在网上搜索,但似乎没有太多具体的内容。我也尝试过notepad++,但是当我尝试比较这些大文件时它会冻结。

-提前谢谢你!!

【问题讨论】:

  • 您熟悉任何编程语言的编程吗?如果是这样,您能否发布有关两个文件的结构和格式的更多详细信息?
  • 在160,000个列表中,电子邮件地址是否在一栏中?如果是这样,您可以将这两个列表放在 Excel 中,并使用vlookup(假设电子邮件地址将完全匹配)查找 18,000 封重复的邮件,然后使用AutoFilterSort 来删除它们。
  • 一个基于正则表达式的解决方案,如果可行的话,对于您的目的来说可能效率很低。
  • 如果你懂一点编程,你可以自己写一个脚本。在 PHP 中,您可以使用 array_diffarray_intersect 之类的函数来比较两个地址数组。
  • 我同意 Scott Holtzman 的观点。假设它们被格式化为 csv,您可以在 excel 中打开它们并使用 vlookup、自动过滤和/或排序等功能来比较列表并将它们过滤掉。需要注意的一件事是,如果您拥有 excel 2003,则它的行数限制为刚刚超过 65,000 行,因此您只希望在拥有 excel 2007 或更高版本的情况下使用此方法。

标签: regex excel list csv


【解决方案1】:

好问题。我解决这个问题的一种方法是制作一个 C++ 程序[你可以将这个想法外推到你选择的语言;您从未提到您精通哪种语言]将较小文件的每个项目读入字符串向量。首先,当然,使用 Excel 将文件保存为 CSV 而不是 XLS 或 XLSX,这将使用逗号分隔值,以便您可以更轻松地使用它们。对于较大的列表,“另存为”仅包含电子邮件地址的副本,暂时删除其他行。

然后,您可以打开更大的列表并使用嵌套循环来检查您是否应该输出到输出文件。比如:

bool foundMatch=false;
for(int y=0;y<LargeListVector.size();y++) {
    for(int x=0;x<SmallListVector.size();x++) {
        if(SmallListVector[x]==LargeListVector[y]) foundMatch=true;
    }
    if(!foundMatch) OutputVector.append(LargeListVector[y]);
    foundMatch=false;
}

这可能是部分伪代码,但你明白吗?

【讨论】:

  • 谢谢!我精通 C++,所以我回家后会试一试(工作中没有编译器可以使用)
【解决方案2】:

所以我在Here阅读了一个论坛帖子

=MATCH(B1,$A$1:$A$3,0)>0

B 列是一个大列表,有 160,000 个输入,A 列是我需要删除的 18,000 个内容的列表。

我用它来匹配所有内容,并在单独的列中粘贴了这个公式。它会打印出错误或 TRUE。如果数据在两列中,则打印为 true。

然后因为我对 excel 很烂,我把这个文本扔到 Notepad++ 中并搜索所有包含 TRUE 的行(匹配大小写,因为在我的例子中,一些数据中的单词 true 没有大写。)我标记了这些行,然后在搜索、书签下,我删除了所有带有书签的行。将其粘贴回excel中,瞧。

我要感谢你们帮助并指出我正确的方向:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2022-12-11
    • 2013-06-27
    • 2010-09-10
    相关资源
    最近更新 更多