Kennen Sie das? Sie suchen anhand eines Namens nach einer Adresse in Ihrer Adress-Datenbank. Doch irgendwie finden Sie die Adresse nicht. Gesucht wurde nach dem Namen Schmitt - leider ohne Erfolg! Warum? Vielleicht schreibts sich der Name ja auch Schmidt oder Schmid. Also erneute suchen: Diesmal nach Schmidt - wieder kein Erfolg. Nun gut, es gibt ja auch noch Schmid - Volltreffer! Leider wurden jetzt aber drei Suchvorgänge benötigt - alles kostbare Zeit, von der man meist nur wenig hat. Irgendwie wünscht man sich, dass automatisch nach ähnlich klingenden Namen gesucht werden könnte. Dann würden in der Eregbnisliste alle Schmitts, Schmidts und Schmids stehen und man bräuchte nur den gesuchten Eintrag anklicken. Ein Algorithmus muss her - und zwar einer, der die Namen so umsetzt, dass eben auch ähnlichklingende Namen gefunden werden. Und hier ist er - der SoundEx-Algorithmus: Public Class SoundEx ' Originalstring Private m_Name As String = "" Public Sub New(ByVal sName As String) m_Name = sName End Sub ' SoundEx-Code zurückgeben Public ReadOnly Property [Get]() As String Get Return GetSoundEx(m_Name) End Get End Property ' SoundEx-Code erzeugen Public Shared Function GetSoundEx(ByVal sName As String) As String If sName.Length = 0 Then Return "" ' Originalstring in Großbuchstaben umwandeln ' und ß nach SS umwandeln sName = sName.ToUpper.Replace("ß", "SS") ' 1. Buchstabe Dim sCode As String = sName.Substring(0, 1) Dim sNumber As String = "" ' jedem weiteren Buchstaben wird nun ein ' numerischer Wert zugewiesen For i As Integer = 1 To sName.Length - 1 Select Case sName.Substring(i, 1) Case "B", "F", "P", "V" sNumber = "1" Case "C", "G", "J", "K", "Q", "S", "X", "Z" sNumber = "2" Case "D", "T" sNumber = "3" Case "L" sNumber = "4" Case "M", "N" sNumber = "5" Case "R" sNumber = "6" ' Alle anderen Buchstaben, Satzzeichen und ' Zahlen werden ignoriert End Select ' numerischen Wert nur verwenden, wenn dieser ' anders ist, als der vorige Wert If sCode.Length = 1 OrElse sCode.EndsWith(sNumber) = False Then sCode &= sNumber End If Next ' SoundEx-Code als Funktionsrückgabewert Return sCode End Function End Class Die SoundEx-Klasse kann wie folgt verwendet werden: Dim sSoundEx As String = SoundEx.GetSoundEx("Name") oder auch so... Dim sSoundEx As String = New SoundEx("Name").Get Welche Ergebnisse liefert der SoundEx-Algorithmus nun bei den Namen "Schmitt", "Schmidt" und "Schmid"?
Wie Sie sehen, liefern alle drei Namen das gleiche SoundEx-Ergebnis. Wie verbindet man nun den SoundEx-Algorithmus mit einer Adress-Datenbank? Dim SQL As String = _ "UPDATE Adressen SET Name = '" & sName & "', " & _ "SoundEx = '" & New SoundEx(strSuch).Get & "' " & _ "WHERE Id = ..." ... Und wenn nun nach einem Namen gesucht wird, suchen Sie einfach (zusätzlich) innerhalb des SoundEx-Feldes: Dim SQL As String = _ "SELECT * FROM Adressen WHERE Name = '" & strSuch & "'" & _ " OR SoundEx = '" & New SoundEx(strSuch).Get & "'" ... Dieser Tipp wurde bereits 14.118 mal aufgerufen.
Anzeige
![]() ![]() ![]() (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevEingabe 3.0 ![]() Einfach stark! Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Tipp des Monats ![]() Manfred Bohn IndexOf für mehrdimensionale Arrays Die generische Funktion "IndexOf" ermittelt das erste Auftreten eines bestimmten Wertes in einem n-dimensionalen Array Access-Tools Vol.1 ![]() Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |