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 |
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). |
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. |
AW: Compare String Funktion
|
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; |
AW: Compare String Funktion
vergleich1 := Copy(Memo1.Lines.Text, 1, 20);
|
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:
Wobei du aufpassen musst wenn du unten angekommen bist, denn da gibt es irgendwann kein i-1 mehr.
vergleich1 := Copy(Memo2.Lines[i], 1, 20);
vergleich2 := Copy(Memo2.Lines[i-1], 1, 20); Zitat:
|
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). |
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; |
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; |
AW: Compare String Funktion
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
Delphi-Quellcode:
kann niemals etwas machen (da es niemals einen Zeilenumbruch darin gibt)
StringReplace(..., #13#10, ' ')
* das zweite
Delphi-Quellcode:
macht aus einer Zeile "mehrere" Zeilen (an Leerzeichen aufgetrennt) und dann verschieben sich alle Lines im Memo
StringReplace(..., ' ', #13#10)
|
AW: Compare String Funktion
Zitat:
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. |
AW: Compare String Funktion
Irgendwie sieht das doch schwer nach 'nem Folgeproblem von CSV anpassen aus:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var i : Integer; sl : TStringList; slNeu : TStringList; sAnrede : String; sTitel : String; sNachname : String; sVorname : String; sABCD : String; sTermin : String; iPos : Integer; sTemp : String; sNameAlt : String; sNameNeu : String; begin sl := TStringList.Create; slNeu := TStringList.Create; sl.AddStrings(Memo1.Lines); sNameAlt := ''; sNameNeu := ''; try for i := 0 to sl.Count - 1 do begin sTemp := Trim(sl[i]); if sTemp = '' then continue; iPos := Pos(' mit',sTemp); sABCD := Copy(sTemp,iPos + 5,Length(sTemp)); sTemp := Copy(sTemp,1,iPos - 1); iPos := Pos(', ',sTemp); sVorname := ''; if iPos > 0 then begin sVorname := Trim(Copy(sTemp,iPos + 1,Length(sTemp))); sTemp := Copy(sTemp,1,iPos - 1); end; iPos := Pos(' ',sTemp); sAnrede := Copy(sTemp,1,iPos - 1); sTemp := Copy(sTemp,iPos + 1,Length(sTemp)); sTitel := ''; iPos := Pos('. ',sTemp); while iPos > 0 do begin sTitel := Format('%s %s',[sTitel,Copy(sTemp,1,iPos)]); sTemp := Trim(Copy(sTemp,iPos + 1,Length(sTemp))); iPos := Pos('. ',sTemp); end; sTitel := Trim(sTitel); sNachname := sTemp; // Zwischen Zeilen unterschiedlicher Personen soll eine Leerzeile eingefügt werden: slNameNeu := Format('%s;%s;%s;%s;',[sAnrede, sTitel, sNachname, sVorname]); if sNameNeu <> sNameAlt then begin // Hat sich der Name geändert? slNeu.Add(''); // Leerzeile einfügen sNameAlt := sNameNeu; // und aktuellen Namen merken. end; slNeu.Add(Format('%s;%s;%s;%s;mit %s: %s', [sAnrede, sTitel, sNachname, sVorname, sABCD, sTermin])); end; // Am Anfang von slNeu ist jetzt (höchstwahrscheinlich) eine überflüssige Leerzeile: if slNeu.Count > 0 then while (slNeu.Count > 0) and (slNeu[0] = '') do slNeu.Delete(0); Memo2.Lines.assign(slNeu); finally slNeu.Free; sl.Free; end; |
AW: Compare String Funktion
Zitat:
Bei z.B. einer TStringList dagegen, dort knallt es wunderbar. |
AW: Compare String Funktion
Zitat:
Delphi-Quellcode:
besser
for i := Memo1.Lines.Count - 1 downto 0 do
Delphi-Quellcode:
for i := Memo1.Lines.Count - 1 downto 1 do
|
AW: Compare String Funktion
Joar, aber Richtung ist hier fast egal, denn das Problem war eigentlich der Index-Bereich,
also beim Zugriff auf
Delphi-Quellcode:
und
[i]
Delphi-Quellcode:
ein
[i-1]
Delphi-Quellcode:
,
1 to/downto Count - 1
bzw. beim Zugriff auf
Delphi-Quellcode:
und
[i]
Delphi-Quellcode:
ein
[i+1]
Delphi-Quellcode:
:zwinker:
0 to/downto Count - 2
|
AW: Compare String Funktion
Hallo,
ich war ein paar Tage raus und wollte mich noch bedanken. Das mit dem Zeilenumbruch klappt super :thumb: :thumb: :thumb: Vielen, vielen Dank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:42 Uhr. |
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