我有3个文本文件(A,B和C),每个文件有几百个电子邮件地址。我想将列表A和列表B合并到一个文件中,忽略大小写和空格的差异。然后我想删除列表C中新列表中的所有电子邮件,再次忽略大小写和空格的差异。
我选择的编程语言通常是C ++,但它似乎不适合这项任务。是否有一种脚本语言可以在相对较少的行中执行此操作(以及类似的任务)?
或者是否有可以让我这样做的软件(免费或商业版)?例如,可以在Excel中执行此操作吗?
答案 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。