vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
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:     [ Jetzt bewerten ]Views:  13.785 
www.tools4vb.deSystem:  WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 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 & "'"
...

Dieser Tipp wurde bereits 13.785 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


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.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle 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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel