将列表中的项目与自己匹配以获得半唯一性

时间:2014-07-10 17:31:48

标签: excel match

我真的只是想找一种工具来检查一列数据中重复的近似值。例如,假设我有一列地址数据:

  • 113 James Way
  • 3448 Harlon Circle
  • 5888 Murray Rd
  • 3448 Harlon Cr。

在这种情况下,条目2和4将非常接近唯一,我想要某种工具,无论是excel还是独立,如果行被复制或大致重复,它会通知我。我不知道如何搜索这样的东西。我尝试搜索模糊匹配工具等,但没有什么是我需要的。谢谢,

2 个答案:

答案 0 :(得分:0)

有几种方法可以解决

一种简单的方法是编写Levenshtein function来比较这些相互关联的内容并突出显示低值

假设您具有以下数据设置

enter image description here

原始示例

Sub FindClosestMatch()
Range("B3").Select
Dim mystrings()
 Range("B3").Select
 Range(Selection, Selection.End(xlDown)).Select
 mystrings = Selection.Value

i = 0
Dim string1 As String, string2 As String
 Range("C3").Select
For i = LBound(mystrings) To UBound(mystrings)
    string1 = mystrings(i, 1)
    For j = 1 To 4
    string2 = mystrings(j, 1)
    ActiveCell.Value = Levenshtein(string1, string2)
    ActiveCell.Offset(0, 1).Select
    Next
    Range("c3").Offset(i, 0).Select

Next
End Sub

如何阅读值

例如113 James Way 0 15 13 12表示该字符串的分数为

  • 0(完全匹配)自身
  • 15 with 3448 Harlon Circle
  • 13 5888 Murray Rd
  • 12 with 3448 Harlon Cr。

宏只是将每个地址与其他地址进行比较,并找到Levenshtein距离

它们最接近匹配的数字越低,当它与自身相比时,显然0完全匹配

此宏假设您已将Levenshtein function复制到VBA模块

答案 1 :(得分:0)

这实际上取决于你需要它的准确程度以及你希望它捕获的匹配类型。如果你想捕捉拼写错误,那就更难了。但是如果你主要想要抓住St vs Street,你可以在左边做一个vlookup(地址,#)或其他东西。可能必须玩#以获得良好的反应。 #需要高于街道号码中的位数(4/5?),但要小到可以捕捉到1干燥的数字。我猜7-8。

基本上,您的地址位于A列(假设从A2开始,带有标题)。 B栏说=左(a2,8) A2显然是独一无二的,因为它是第一个。 从C3开始使用= vlookup(左(a3,8),$ B $ 2:B2,1,0)

它将为所有唯一条目和重复的地址打印错误。为了使它更干净,你可以添加一个if(iserror()) = if(iserror(vlookup(左(a3,8),$ B $ 2:B2,1,0),“”,vlookup(左(a3,8),$ B $ 2:B2,1,0))