AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Compare String Funktion

Ein Thema von julchen · begonnen am 26. Jan 2021 · letzter Beitrag vom 9. Feb 2021
Antwort Antwort
Seite 1 von 2  1 2      
julchen

Registriert seit: 20. Mär 2008
115 Beiträge
 
Delphi 10.3 Rio
 
#1

Compare String Funktion

  Alt 26. Jan 2021, 20:03
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
Kollegin: Am Wochenende wird mein PC immer langsamer! Liegt das am Strom?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Compare String Funktion

  Alt 26. Jan 2021, 20:35
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).
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.912 Beiträge
 
Delphi 12 Athens
 
#3

AW: Compare String Funktion

  Alt 26. Jan 2021, 21:39
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.166 Beiträge
 
Delphi 12 Athens
 
#4

AW: Compare String Funktion

  Alt 27. Jan 2021, 11:09
StartsWith ?
  Mit Zitat antworten Zitat
julchen

Registriert seit: 20. Mär 2008
115 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Compare String Funktion

  Alt 27. Jan 2021, 13:59
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;
Kollegin: Am Wochenende wird mein PC immer langsamer! Liegt das am Strom?
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#6

AW: Compare String Funktion

  Alt 27. Jan 2021, 14:12
vergleich1 := Copy(Memo1.Lines.Text, 1, 20);
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
730 Beiträge
 
Delphi 12 Athens
 
#7

AW: Compare String Funktion

  Alt 27. Jan 2021, 14:22
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.
  Mit Zitat antworten Zitat
julchen

Registriert seit: 20. Mär 2008
115 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Compare String Funktion

  Alt 28. Jan 2021, 18:07
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;
Kollegin: Am Wochenende wird mein PC immer langsamer! Liegt das am Strom?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#9

AW: Compare String Funktion

  Alt 28. Jan 2021, 18:28
in einem Memo1.Lines[i] gibt es keine Zeilenumbrüche ... das ist nur Inhalt einer Zeile (mit Umbrüchen drin, wären es ja mehrere Zeilen)
Somit machen deine StringReplace nicht das, was du willst.
* das erste StringReplace(..., #13#10, ' ') kann niemals etwas machen (da es niemals einen Zeilenumbruch darin gibt)
* das zweite StringReplace(..., ' ', #13#10) macht aus einer Zeile "mehrere" Zeilen (an Leerzeichen aufgetrennt) und dann verschieben sich alle Lines im Memo
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
730 Beiträge
 
Delphi 12 Athens
 
#10

AW: Compare String Funktion

  Alt 29. Jan 2021, 07:08
Wenigstens läuft es schon mal fehlerfrei durch:

Delphi-Quellcode:
     for i := Memo1.Lines.Count - 1 downto 0 do
     begin
      laenge1 := length(Memo1.Lines[i]);
      laenge2 := length(Memo1.Lines[i-1]); // Was passiert hier, wenn i=0 ist?
Bist du sicher, dass das fehlerfrei durchläuft. Kann eigentlich nicht.

Im übrigen würde ich das mit einer zweiten Stringlist lösen, so wie im Vorschlag von EmWieMichael. Dabei kopierst du einfach die Zeilen, die du brauchst in die zweite Stringlist bzw. erzeugst da die Leerzeilen, wo du sie brauchst. Das originale Memo bleibt dabei unverändert und du musst dich nicht mit veränderten Zeilen-Indizes herumärgern, die zwangsläufig durch das Entfernen von Zeilen entstehen.

Erst ganz zum Schluss kannst du die zweite Stringlist ins originale Memo zurückkopieren.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz