Excel 如何找到非';不是100%重复吗?
我有一份从我的组织获得援助的人的名单 有些人用不同的拼写或顺序登记自己的名字 这里有一个例子Excel 如何找到非';不是100%重复吗?,excel,vba,duplicates,Excel,Vba,Duplicates,我有一份从我的组织获得援助的人的名单 有些人用不同的拼写或顺序登记自己的名字 这里有一个例子 **Names** **ID** Ahmed mohammed Saleh 3576158946 Personal ID Waleed Khalid Ali 5478698645 Personal ID Fatima Nader Aljalal 46
**Names** **ID**
Ahmed mohammed Saleh 3576158946 Personal ID
Waleed Khalid Ali 5478698645 Personal ID
Fatima Nader Aljalal 4684325986 Personal ID
Hussan Huessien Ahmed 778569 Family ID
*Ahmed Mohamed Salah* 698745 Family ID
*Waleed Ali Khalid* No ID
名单上的最后两名登记了两次
我的数据有4000行,我必须找到部分重复项。减少任务难度的一种方法是将名称散列为一个排序的小写字符字符串,删除重复字符、空格和元音。然后可以比较散列名称以确定相似性。在下面的示例中,我们很幸运,我们得到了精确的匹配,但编写进一步的函数来检查哈希名称是否有一个、两个或多个字符的差异,并且事实上原始名称是合理的匹配
Option Explicit
Private Type State
CharArray As Variant
End Type
Private s As State
Public Sub test()
Initialise
Debug.Print "Ahmed mohammed Saleh", ConvertNameToHash("Ahmed mohammed Saleh")
Debug.Print "Ahmed Mohamed Salah", ConvertNameToHash("Ahmed Mohamed Salah")
Debug.Print "Waleed Khalid Ali", ConvertNameToHash("Waleed Khalid Ali")
Debug.Print "Waleed Ali Khalid", ConvertNameToHash("Waleed Ali Khalid")
End Sub
Public Sub Initialise()
s.CharArray = Split("b,c,d,f,g,h,j,k,l,m,n,p,q,r,s,t,v,w,x,y,z", ",")
End Sub
Public Function ConvertNameToHash(ByVal ipName As String) As String
Dim myChars As String
Dim myName As String
myName = LCase$(ipName)
Dim myChar As Variant
For Each myChar In s.CharArray
If InStr(myName, myChar) > 0 Then
myChars = myChars & myChar
End If
Next
ConvertNameToHash = myChars
End Function
上述代码的输出为
Ahmed mohammed Saleh dhlms
Ahmed Mohamed Salah dhlms
Waleed Khalid Ali dhklw
Waleed Ali Khalid dhklw
减少任务难度的一种方法是将名称散列为排序的小写字符字符串,并删除重复字符、空格和元音。然后可以比较散列名称以确定相似性。在下面的示例中,我们很幸运,我们得到了精确的匹配,但编写进一步的函数来检查哈希名称是否有一个、两个或多个字符的差异,并且事实上原始名称是合理的匹配
Option Explicit
Private Type State
CharArray As Variant
End Type
Private s As State
Public Sub test()
Initialise
Debug.Print "Ahmed mohammed Saleh", ConvertNameToHash("Ahmed mohammed Saleh")
Debug.Print "Ahmed Mohamed Salah", ConvertNameToHash("Ahmed Mohamed Salah")
Debug.Print "Waleed Khalid Ali", ConvertNameToHash("Waleed Khalid Ali")
Debug.Print "Waleed Ali Khalid", ConvertNameToHash("Waleed Ali Khalid")
End Sub
Public Sub Initialise()
s.CharArray = Split("b,c,d,f,g,h,j,k,l,m,n,p,q,r,s,t,v,w,x,y,z", ",")
End Sub
Public Function ConvertNameToHash(ByVal ipName As String) As String
Dim myChars As String
Dim myName As String
myName = LCase$(ipName)
Dim myChar As Variant
For Each myChar In s.CharArray
If InStr(myName, myChar) > 0 Then
myChars = myChars & myChar
End If
Next
ConvertNameToHash = myChars
End Function
上述代码的输出为
Ahmed mohammed Saleh dhlms
Ahmed Mohamed Salah dhlms
Waleed Khalid Ali dhklw
Waleed Ali Khalid dhklw
这并不容易,你必须定义拼写检查,你必须定义哪一个拼写错误,哪一个正确。你是否尝试过使用Excel中内置的“查找重复项”选项?它会高亮显示重复项,因此任何未高亮显示的内容都不会是重复项。。。但最终,如果它们的拼写不同,那么它们在定义上就不是重复的。一种是像瓦利德·哈立德·阿里和瓦利德·阿里·哈立德一样并置。对于这些,你需要建立规则,你需要为人类做标记。例如,突出显示“如果第一个相同,第二个和第三个相同”。另一个是拼写。“Mhmd”可以使用Regix识别*穆罕默德或穆罕默德或穆罕默德。这两个系统需要相互并行应用。通过将名称视为字符集合,您可能会取得一些进展。这并不容易,您必须定义拼写检查,必须定义哪个拼写错误,哪个拼写正确。您是否尝试过使用Excel中的内置“查找重复项”选项?它会高亮显示重复项,因此任何未高亮显示的内容都不会是重复项。。。但最终,如果它们的拼写不同,那么它们在定义上就不是重复的。一种是像瓦利德·哈立德·阿里和瓦利德·阿里·哈立德一样并置。对于这些,你需要建立规则,你需要为人类做标记。例如,突出显示“如果第一个相同,第二个和第三个相同”。另一个是拼写。“Mhmd”可以使用Regix识别*穆罕默德或穆罕默德或穆罕默德。这两个系统需要相互并行应用。通过将名称视为字符集合,您可能会取得一些进展。?