Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Compare String Funktion (https://www.delphipraxis.net/206757-compare-string-funktion.html)

julchen 26. Jan 2021 20:03

Compare String Funktion
 
Hallo,

ich habe eine Textliste, die so mit ca. 300 Namen aufgebaut ist:

Herr Mustermann mit ABCDEFGHI/00A (1): bla bla bla(08:00 Uhr)

Herr Mustermann mit ABCDEFGHI/00A (1): bla bla bla(10:00 Uhr)

Herr Dr. Meier mit XYZDEFGHI/00B (1): bla bla bla(08:00 Uhr)

Herr Dr. Meier mit XYZDEFGHI/00B (1): bla bla bla(08:00 Uhr)

Ich würde gerne die Leerzeilen zwischen den zwei Mustermanns und den zwei Meiers entfernen:

Herr Mustermann mit ABCDEFGHI/00A (1): bla bla bla(08:00 Uhr)
Herr Mustermann mit ABCDEFGHI/00A (1): bla bla bla(10:00 Uhr)

Herr Dr. Meier mit XYZDEFGHI/00B (1): bla bla bla(08:00 Uhr)
Herr Dr. Meier mit XYZDEFGHI/00B (1): bla bla bla(08:00 Uhr)

Gibt es eine fertige String Compare Funktionen, mit der ich die ersten 20 Zeichen vergleichen kann?

VG, Julia

stahli 26. Jan 2021 20:35

AW: Compare String Funktion
 
Mit Copy(1,20) kannst Du die ersten 20 Zeichen aus dem String "herauskopieren".

Mit Pos(':', MyString) könntest Du auch noch das erste Vorkommen eines Doppelpunktes ermitteln (falls es nicht immer exakt eine feste Anzahl von Zeichen wäre).

jaenicke 26. Jan 2021 21:39

AW: Compare String Funktion
 
Es gibt die Funktion AnsiStartsText (bzw. mit Prüfung der Groß- und Kleinschreibung AnsiStartsStr), mit der du prüfen kannst, ob ein String am Anfang eines anderen vorkommt. Du kannst also die Position des ' mit ' oder des Doppelpunkts ermitteln und den String bis dorthin herauskopieren. Dann kannst du prüfen, ob die nächste Zeile damit anfängt.

Das kann man natürlich auch anders und schneller machen, aber bei der Anzahl lohnt das wohl nicht.

Rollo62 27. Jan 2021 11:09

AW: Compare String Funktion
 
StartsWith ?

julchen 27. Jan 2021 13:59

AW: Compare String Funktion
 
Mein erster Versuch.
In den Labels wird der extrahierte String angezeigt.
Soweit funktioniert es.
Aber das if wird nicht weiter durchlaufen.


Code:
procedure TForm1.Button3Click(Sender: TObject);
var
i: integer;
vergleich1, vergleich2: string;
begin
    for i := Memo2.Lines.Count - 1 downto 0 do
    begin
       vergleich1 := Copy(Memo2.Lines.Text, 1, 20);
       vergleich2 := Copy(Memo2.Lines.Text, 1, 20);

       Label1.Caption := vergleich1;
       Label2.Caption := vergleich2;

       if (vergleich1 <> vergleich2) then begin
         Memo2.Lines[i] := '#13#10';
       end;
    end;
end;

Blup 27. Jan 2021 14:12

AW: Compare String Funktion
 
vergleich1 := Copy(Memo1.Lines.Text, 1, 20);

bcvs 27. Jan 2021 14:22

AW: Compare String Funktion
 
Du vergleichst in der Schleife jedesmal die ersten 20 Zeichen des gesamten Textes mit den ersten 20 Zeichen des gesamten Textes. Wie soll das jemals <> werden?

Wahrscheinlich meinst etwas in der Art
Delphi-Quellcode:
       vergleich1 := Copy(Memo2.Lines[i], 1, 20);
       vergleich2 := Copy(Memo2.Lines[i-1], 1, 20);
Wobei du aufpassen musst wenn du unten angekommen bist, denn da gibt es irgendwann kein i-1 mehr.

Zitat:

Delphi-Quellcode:
       if (vergleich1 <> vergleich2) then begin
         Memo2.Lines[i] := '#13#10';

Damit würdest du die aktuelle Zeile mit einer Leerzeile überschreiben, also den bisherigen Inhalt entfernen.

Rollo62 27. Jan 2021 15:27

AW: Compare String Funktion
 
Warum 20 Zeichen ?
Wäre es nicht besser und sicherer nach irgendeinem eindeutigen Delimiter zu suchen ?
Z.B. "):"

http://docwiki.embarcadero.com/Libra.../de/System.Pos
Delphi-Quellcode:
    LPos1 := Pos( AText1, '):');  
    LPos2 := Pos( AText2, '):');
    if LPos1 = LPos2 then
    begin
        Result := MussEchtVergleichen( AText1, AText2);
    end
    else
        Result := False;

Das würde auch den Vergleich beschleunigen, wenn nämlich die Positionen unterschiedlich sind, dann muss es <> sein, und man braucht nicht mehr echt zu vergleichen (was teuer ist).

EmWieMichael 27. Jan 2021 18:02

AW: Compare String Funktion
 
Delphi-Quellcode:
procedure TForm1.Test;
 var I:Integer; TmpList:TStringList; S1,S2:String; LeerzeileImSinn:Boolean;
begin
  TmpList:=TStringList.Create;
  S1:=''; S2:=''; LeerzeileImSinn:=False;
  for I:=0 to Memo2.Lines.Count - 1 do
   begin
     if (Memo2.Lines[I] > '') then
      begin
        S1:=Copy(Memo2.Lines[I], 1, Pos(':', Memo2.Lines[I]));
        if LeerzeileImSinn then
         begin
           if (S1 <> S2) then
            begin
              TmpList.Add('');
              S2:=S1;
              LeerzeileImSinn:=False;
            end;
         end
        else
         S2:=S1;
        TmpList.Add(Memo2.Lines[I]);
      end
     else
      LeerzeileImSinn:=True;
   end;

  Memo2.Lines.Assign(TmpList);

  TmpList.Free;
end;

julchen 28. Jan 2021 18:07

AW: Compare String Funktion
 
Ich habe mir überlegt, dass, wenn ich die Länge der Zeilen abzähle und die miteinander vergleiche, auch zu einem Ergebnis kommen müsste.
Ich weiss aber nicht, was das Gegenteil von #13#10 ist.
Wenigstens läuft es schon mal fehlerfrei durch:

Code:
procedure TForm1.Button4Click(Sender: TObject);
var
i: integer;
laenge1, laenge2: Integer ;
begin
     for i := Memo1.Lines.Count - 1 downto 0 do
     begin
      laenge1 := length(Memo1.Lines[i]);
      laenge2 := length(Memo1.Lines[i-1]);

      if laenge1 > laenge2 then
          begin
            Memo1.Lines[i] := StringReplace(Memo1.Lines[i], #13#10, ' ', [rfReplaceAll]);
          end
        else
          begin
            Memo1.Lines[i] := StringReplace(Memo1.Lines[i], ' ', #13#10 , [rfReplaceAll]);
          end
      end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz