项目列表几乎重复

时间:2016-08-19 13:16:13

标签: excel vba fuzzy-search

在excel中,我有一个艺术家,歌曲,版本列表。 此列表包含超过15000条记录。 问题是该列表确实包含一些"重复"记录。我说"重复"因为它们不完全匹配。有些可能会有一些拼写错误,我想解决这个问题并删除这些记录。

例如,有些记录:

ABBA - Mamma Mia - Party
ABBA - Mama Mia! - Official

每个破折号表示一个单独的列(因此填充了3列A,B,C)

如何在Excel中将它们标记为重复项?

我发现了模糊查找工具。然而,我正在使用Mac工作,因为我无法在mac上工作,所以卡住了。

任何正则表达式魔法或vba脚本有什么可以帮助我的? 它也可以看到行的相似程度(比如80%相似)。

3 个答案:

答案 0 :(得分:1)

模糊文本匹配的常用方法之一是Levenshtein(距离)算法。这里存在几个很好的实现:

https://stackoverflow.com/a/4243652/1278553

从那里,您可以直接在电子表格中使用该功能来查找实例之间的相似之处:

enter image description here

你没有问,但数据库在这里真的很不错。原因是你可以进行笛卡尔连接(这是极少数有效用途之一)并将每一条记录与其他每条记录进行比较。例如:

select
  s1.group, s2.group, s1.song, s2.song,
  levenshtein (s1.group, s2.group) as group_match,
  levenshtein (s1.song, s2.song) as song_match
from
  songs s1
  cross join songs s2
order by
  group_match, song_match

是的,这将是一个非常昂贵的查询,具体取决于记录的数量(在您的示例中为225,000,000行),但它会冒出最可能重复/匹配的顶部。不仅如此,你还可以合并"合理的"加入以消除明显的不匹配,例如将其限制为组匹配,几乎匹配,以相同字母开头等的情况,或者预先过滤掉Levenschtein大于x的组。

答案 1 :(得分:0)

您可以使用数组公式来表示重复项,并且您可以修改下面的行以显示行号,这会检查条目下方的行是否存在任何可能的80%欺骗行为,其中80%是从左到右,而不是完全比较。我的数据是a1:a15000

=IF(NOT(ISERROR(FIND(MID($A1,1,INT(LEN($A1)*0.8)),$A2:$A$15000))),1,0)

这种方式也会回顾列表,以指出找到的列表

=SUM(IF(ISERROR(FIND(MID($A2,1,INT(LEN($A1)*0.8)),$A3:$A$15000,1)),0,1))+SUM(IF(ISERROR(FIND(MID($A2,1,INT(LEN($A2)*0.8)),$A$1:$A1,1)),0,1))

第一个条目,即第1行是公式的第一部分,最后一行将需要+

之后的最后一部分

答案 2 :(得分:-1)

在循环中尝试此工作表功能:

=COUNTIF(Range,"*yourtexttofind*")