Announcement

Collapse
No announcement yet.

Stringvergleich auf Ähnlichkeit

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Stringvergleich auf Ähnlichkeit

    Frohes Neues rundherum,

    ich suche nach einer Funktion für D4, die zwei Strings auf Ähnlichkeit vergleicht. Ich möchte Namen aus einer Kundendatei mit Namen aus Überweisungen der Bank vergleichen um den Ausgleich offener Posten zuordnen zu können.

    Problem: Der Kundenname in der lokalen Kundendatei ist oft nur ähnlich zu dem Kundennamen, wie er von den Banken übermittelt wird. Kann ich das trotzdem irgendwie hinbekommen?

    Zur Sicherheit noch ein paar Beispiele:

    Müller GmbH <-> Sanitär Müller GmbH

    R. Maier <-> Renate Maier

    R. Maier <-> Maier, Renate

    Viele Grüße
    Ralph

  • #2
    Hallo,

    schaue mal hier. Vielleicht ist das was für dich
    http://www.swissdelphicenter.ch/de/showcode.php?id=759

    Gruß
    Joh

    Comment


    • #3
      Hallo!<br>
      Such mal hier im Forum nach phonetisch.<br>
      BYE BERN

      Comment


      • #4
        John,

        danke für den Hnweis! Diese Funktion prüft allerdings leider nur auf die Übereinstimmung vom Beginn des Strings an.

        Maier <-> Maier, Renate

        würde funktionieren,

        Renate Maier <-> Maier, Renate

        aber nicht.

        Ich werde mir wohl was mit einem Token-Vergleich basteln müssen...

        Ralp

        Comment


        • #5
          Bernd,

          auch Dir herzlichen Dank!

          An SoundEx oder ähnliche Funktionen habe ich auch schon gedacht, werde es aber (wie in der Antwort an John erwähnt) mal mit einem Vergleich auf Token-Basis versuchen.

          Ralp

          Comment


          • #6
            Hi Ralp,<br>habe da noch was in den Tiefen meiner Platte etwas gefunden. Ist aus der P:I:C:S Fundgrube (Simon Reinhard)<br>Vielleicht hilft's...<br>
            <PRE>
            { Like prüft die Übereinstimmung eines Strings mit einem Muster.
            So liefert Like('Delphi', 'D*p?i') true.
            Der Vergleich berücksichtigt Klein- und Großschreibung.
            Ist das nicht gewünscht, muss statt dessen
            Like(AnsiUpperCase(AString), AnsiUpperCase(APattern)) benutzt werden: }

            function Like(const AString, APattern: String): Boolean;
            var
            StringPtr, PatternPtr: PChar;
            StringRes, PatternRes: PChar;
            begin
            Result:=false;
            StringPtr:=PChar(AString);
            PatternPtr:=PChar(APattern);
            StringRes:=nil;
            PatternRes:=nil;
            repeat
            repeat // ohne vorangegangenes "*"
            case PatternPtr^ of
            #0: begin
            Result:=StringPtr^=#0;
            if Result or (StringRes=nil) or (PatternRes=nil) then
            Exit;
            StringPtr:=StringRes;
            PatternPtr:=PatternRes;
            Break;
            end;
            '*': begin
            inc(PatternPtr);
            PatternRes:=PatternPtr;
            Break;
            end;
            '?': begin
            if StringPtr^=#0 then
            Exit;
            inc(StringPtr);
            inc(PatternPtr);
            end;
            else begin
            if StringPtr^=#0 then
            Exit;
            if StringPtr^<>PatternPtr^ then begin
            if (StringRes=nil) or (PatternRes=nil) then
            Exit;
            StringPtr:=StringRes;
            PatternPtr:=PatternRes;
            Break;
            end
            else begin
            inc(StringPtr);
            inc(PatternPtr);
            end;
            end;
            end;
            until false;
            repeat // mit vorangegangenem "*"
            case PatternPtr^ of
            #0: begin
            Result:=true;
            Exit;
            end;
            '*': begin
            inc(PatternPtr);
            PatternRes:=PatternPtr;
            end;
            '?': begin
            if StringPtr^=#0 then
            Exit;
            inc(StringPtr);
            inc(PatternPtr);
            end;
            else begin
            repeat
            if StringPtr^=#0 then
            Exit;
            if StringPtr^=PatternPtr^ then
            Break;
            inc(StringPtr);
            until false;
            inc(StringPtr);
            StringRes:=StringPtr;
            inc(PatternPtr);
            Break;
            end;
            end;
            until false;
            until false;
            end; {Michael Winter}
            </PRE>
            <br>cu Michae

            Comment


            • #7
              Michael,

              sorry, dass ich mich erst jetzt melde, ich habe Deine Antwort eben erst entdeckt...

              Hört sich gut an, ich werde mal testen, ob das was für mich ist. Die Dringlichkeit ist allerdings nicht mehr so hoch, weil ich mittlerweile nicht mehr die Namen der Kunden prüfe, sondern die Rechnungsnummern (die in den meisten Fällen auf der Überweisung angegeben werden) auswerte.

              Ralp

              Comment

              Working...
              X