比较两个地址列

时间:2016-08-05 17:08:34

标签: excel compare

我在U和V中有地址。我想看看它们是否有点类似,如果他们说“更新”如果不说“忽略”。

例如,U中的246 N High street和V中的246 North High St将返回值Update。 U中的246 N High Street和V中的458 Auburn Drive将返回Omit的值。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

有很多算法可以进行模糊匹配。在excel中实现的更容易的是N-Gram。

要执行n-gram匹配,我们必须将每个地址分解为一组较小字符长度的列表。地址246 N High street的2克列表看起来像24,46,6 , N,N , H,Hi,ig,gh,h , s,st,tr,re,ee,et。我们可以使用3-gram进行相同的操作:246,46 ,6 N, N ,N H, Hi,Hig,igh,gh ,h s, st,str,tre,ree,eet

我们对这两个地址执行此操作,然后我们可以检查第一个地址列表中的每个项目,看它是否出现在第二个地址的列表中;计算匹配并将其除以第一个列表中的项目数。这将给你一个百分比的接近程度。

您可以使用单元格公式mid()countif()来表示使用表单公式,但我认为在VBA中将其写出来并使其成为UDF更容易。

Function NGramCompare(string1 As String, string2 As String, intGram As Integer) As Double
    'Take in two strings and the N-gram
    Dim intChar As Integer, intGramMatch As Integer
    Dim ngramList1 As String, ngramList2 As String, nGram As Variant
    Dim nGramArr1 As Variant

    'split the first string into a list of ngrams        
    For intChar = 1 To Len(string1) - (intGram-1)
        If ngramList1 <> "" Then ngramList1 = ngramList1 & ","
        ngramList1 = ngramList1 & Mid(string1, intChar, intGram)
    Next intChar

    'split the secong string into a list of ngrams        
    For intChar = 1 To Len(string2) - (intGram-1)
        If ngramList2 <> "" Then ngramList2 = ngramList2 & ","
        ngramList2 = ngramList2 & Mid(string2, intChar, intGram)
    Next intChar

    'Split the ngramlist1 into an array through which we can iterate
    nGramArr1 = Split(ngramList1, ",")

    'Iterate through array and compare values to ngramlist2
    For Each nGram In nGramArr1
        If InStr(1, ngramList2, nGram) Then
            'we found a match, add to the counter
            intGramMatch = intGramMatch + 1
        End If
    Next nGram

    'output the percentage of grams matching.
    NGramCompare = intGramMatch / (UBound(nGramArr1) + 1)
End Function

如果您从未使用过UDF:

  1. 使用Alt + F11
  2. 转到visual basic editor(VBE)
  3. 在VBA项目窗口中,找到您的工作簿并右键单击名称
  4. 选择:插入&gt;&gt;模块
  5. 双击列表中的新模块以显示其代码窗口
  6. 将此功能粘贴并保存您的工作簿
  7. 然后,假设地址1位于A1且地址2位于B1,您可以将其放入C1

    =NGramCompare(A1, B1, 2) 
    

    对于您的第一个地址,将吐出56%。这似乎是一个相当不错的匹配。如果您发现正在获得太多正面命中,则可以通过更改最后一个参数将2-gram更改为3-gram。

    更进一步,它会说&#34;更新&#34;或者&#34; Omit&#34;你可以这样做:

    =If(NGramCompare(A1, B1, 2)>.30, "Update", "Omit")
    

    我只是设置它以便它会考虑超过30%的匹配,但您可以根据需要进行调整。无论你在哪里设置它,你可能会得到一定比例的误报或漏报,但这就是模糊匹配的方式。

答案 1 :(得分:0)

一些天真的方法可以比较前几个字符

=LEFT(A1,5)=LEFT(B1,5)

或更换零件直至匹配

=(SUBSTITUTE(SUBSTITUTE(LOWER(A2)," street"," ST")," north "," N ")
 =SUBSTITUTE(SUBSTITUTE(LOWER(B2)," street"," ST")," north "," N "))
在调整大多数情况后,两者都可能变成一个丑陋的公式