2016-08-19 74 views
1

在Excel中我有一个艺术家,歌曲,版本列表。 此列表包含超过15000条记录。 问题是该列表包含一些“重复”记录。我说“重复”,因为它们不完全匹配。有些人可能会有一些错字,我想解决这些问题并删除这些记录。物品列表发现几乎重复

因此,例如一些记录:

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

每个破折号表示一个单独的列(SO 3列A,B,C都填写)

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

我已经找到关于该工具模糊查找。然而,我正在一个mac上工作,因为它没有在mac上可用我卡住了。

任何正则表达式魔术或vba脚本什么可以帮助我? 看看这个排有多少相似(比如80%的相似)也没关系。

+1

这是我发现唯一有用的模糊匹配代码:http://www.mrexcel。com/forum/excel-questions/195635-fuzzy-matching-new-version-plus-explanation.html –

回答

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

试试这个工作表类函数在循环:

=COUNTIF(Range,"*yourtexttofind*") 
+0

对不起,但这不会诀窍。该函数返回用特定文本找到的项目数量。所以如果我找“ABBA - 妈妈咪呀!”它会返回1.它不会检测到其他行,并将其视为完全不同的事物。我需要的是找到一个近似匹配。如果它是一个近似的匹配标记,它会重复。 – Baklap4

+0

使用*将添加通配符 –

+0

实际上,它可以工作,我用它在我的工作任务中找到近似值。我通常需要在15000计数电子表格中找到“失败”。问题是,很多时候是“失败 - 其他事情”或其“

some text Fail some more text
。所以对我来说它工作正常:P –

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行是第一部分公式和最后一行将需要在+

+0

我如何在列表中充分使用这个数据,其中数据没有排序,而类似的数据没有总是必须低于另一个..? – Baklap4

+0

它会在上面的一个中被检测到,所以ABC123之前的ABC123将被ABC显示为旁边的123,如果另一种方式显示999将会一直显示以上。 –