2016-08-05 107 views
0

我有U和V的地址。我想看看他們是否有點類似,如果他們說「更新」如果不是說「省略」。比較兩個地址列

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

任何想法?

+1

這是一般的難題。你需要使用某種模糊匹配。查看答案[這裏](http://stackoverflow.com/questions/14821345/excel-approximate-text-match)瞭解如何去做。 –

回答

0

有很多做模糊匹配的算法。在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. 轉到Visual Basic編輯器(VBE)使用Alt + F11
  2. 在VBA項目窗口,找到你的工作簿,然後右鍵點擊名稱
  3. 選擇:插入>>模塊
  4. 雙擊新的模塊列表,彈出它的代碼窗口
  5. 在這個函數和粘貼保存工作簿

然後,假設地址1是A1和地址2爲B1,你可以說,在C1

=NGramCompare(A1, B1, 2) 

其中,對於你的第一個地址,會吐出56%。這似乎是一個相當不錯的比賽。如果你發現你獲得了太多積極的命中,你可以通過改變最後一個參數來改變你的2克爲3克。

把它更進了一步,因此會說「更新」或「忽略」你可以這樣做:

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

我只是設置,以便它會考慮匹配任何東西30%以上,但你可根據需要進行調整。不管你在哪裏設置它,你最終可能會得到一些比較結果是誤報或誤報,但這就是模糊匹配的方式。

+0

這太棒了,謝謝! – Ryan

+0

哇,這太神奇了,我只是把它和它的工作,很快!非常感謝!! – Ryan

+0

當然可以。過去我曾經遇到過幾次這個問題,但直到最近才知道要解決這個問題。我很驚訝網絡上沒有類似的功能,但我從來沒有碰到過。 – JNevill

0

一些幼稚的方法可以是前幾個字符

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

比較或直到它們匹配

=(SUBSTITUTE(SUBSTITUTE(LOWER(A2)," street"," ST")," north "," N ") 
=SUBSTITUTE(SUBSTITUTE(LOWER(B2)," street"," ST")," north "," N ")) 

都可能會變成一個大的難看的公式調整後,更換零件大多數情況下

+0

That = Left會很好的工作,我可以看看前幾位數字,看看它們是否匹配。非常感謝 – Ryan

+0

然後在第一個空格之前得到所有東西'= LEFT(A1,FIND(「,A1) - 1)' – Slai