vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Variablen/Strings · Algorithmen/Mathematik   |   VB-Versionen: VB.NET09.10.07
SoundEx - Klasse (.NET)

Schmidt, Schmitt oder Schmid - wie schreibt sich den nun der Name der gesuchten Adresse? Mit SoundEx ist das egal!

Autor:   Dieter OtterBewertung:  Views:  12.085 
www.tools4vb.deSystem:  WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

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"?

SchmittS253
SchmidtS253
SchmidS253

Wie Sie sehen, liefern alle drei Namen das gleiche SoundEx-Ergebnis.

Wie verbindet man nun den SoundEx-Algorithmus mit einer Adress-Datenbank?
Hierzu fügen Sie der Datenbank-Tabelle einfach ein neues Feld hinzu und nennen es SoundEx. Beim Speichern neuer, wie auch beim Ändern vorhandener Adressen müssen Sie jetzt zusätzlich den mit der SoundEx-Funktion ermittelten String mit abspeichern.

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 & "'"
...



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(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.
 
 
Copyright ©2000-2019 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


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.