![]() |
AW: String mit einer Datei abgleichen
vielleicht habe ich sonst noch was falsch gesetzt?
Delphi-Quellcode:
procedure TForm1.EingangTimer(Sender: TObject);
var msg, s, s2, s3: String; sl, List : TStrings; i : integer; begin if IdTcpClient1.Connected then begin msg := IdTCPClient1.IOHandler.ReadLn('', 5); if msg <> '' then begin zaehler := zaehler +1; sl := TStringList.Create; sl.delimiter := ':'; sl.DelimitedText := msg; if sl.Strings[0] = '100' then begin end else begin if sl.Strings[5] = '' then begin sl.Strings[5] := 'kein Text'; end else begin sl.Strings[5] := 'mit Text'; end; s := sl.Strings[0] + ' | ' + sl.Strings[1] + ' | ' + sl.Strings[2] + ' | ' + sl.Strings[3] + ' | ' + sl.Strings[4] + ' | ' + Format('%.6d',[zaehler]) + ' | ' + trim(sl.Strings[5]); Memo1.Lines.Insert(0, 'Log | ' + datetostr(date) + ' | ' + timetostr(time) + ' | ' + ' IdTCPClient1 | ' + s); Statusbar1.SimpleText := 'Log | IdTCPClient1 | ' + s; if FileExists( ExtractFilePath( ParamStr( 0 ) ) + '\List.dat' ) then begin s2 := sl.Strings[3]; ShowMessage(s2); List := TStringList.Create; try List.LoadFromFile( ExtractFilePath( ParamStr( 0 ) ) + '\List.dat' ); for i := 0 to List.Count - 1 do begin s3 := StringReplace( List.Strings[i], ',', '', [rfReplaceAll] ); ShowMessage(s3); if s2 = s3 then begin Shape1.Brush.Color := clgreen; Reset_Netz_Id.Enabled := true; end else begin Query_Monitord.Refresh; Shape1.Brush.Color := cllime; Reset_Alarm.Enabled := true; end; break; end; finally List.Free; end; end; end; end; end; end; |
AW: String mit einer Datei abgleichen
Nur mal so eine Idee.
Kann sein, dass du gar keine Zeilenumbrüche in deiner Datei hast, dein Editor fügt sie in deiner Vorschau automatisch ein, doch in Wirklichkeit deine Datei aus einer Zeile besteht? Schau dir im debug einfach die Zeilen von Liste an. |
AW: String mit einer Datei abgleichen
Liste der Anhänge anzeigen (Anzahl: 1)
nochmal zum Verstädnis!
hier die aktuelle List: siehe Bild! s2 ist = "12345"
Delphi-Quellcode:
ist = ShowMessage(s3) = "12345 6789"
s3 := StringReplace( List.Strings[i], ',', '', [rfReplaceAll] );
ShowMessage(s3); soll = ShowMessage(s3) ist falsch! es müsste "12345" heißen |
AW: String mit einer Datei abgleichen
Deine Daten sind laut Screenshot mittels Komma getrennt und nicht jeder Wert auf einer Zeile.
Kannst du deine Vergleichsdaten nicht ändern, so dass in jeder Zeile nur ein Wert steht? Das wurde weiter oben auch schon angemerkt. |
AW: String mit einer Datei abgleichen
Ersetze
Delphi-Quellcode:
doch mal durch
s3 := StringReplace( List.Strings[i], ',', '', [rfReplaceAll] );
Delphi-Quellcode:
Wie sieht es jetzt aus?
s3 := StringReplace( List.Strings[i], ',', sLineBreak, [rfReplaceAll] );
Delphi-Quellcode:
würde ich auch noch durch
if s2 = s3 then
Delphi-Quellcode:
ersetzen um bei dem Vergleich mögliche Leerzeichen zu ignorieren.
if Trim(s2) = Trim(s3) then
|
AW: String mit einer Datei abgleichen
Ich bin jetzt etwas verwirrt. Im Post #1 und #7 hast du Zahlen untereinander stehen.
Jetzt im Post #13 auf einmal nebeneinander. Ich deute das Ergebnis aus Showmessage nun so, dass die Zahlen kommagetrennt nebeneinander in den Zeilen stehen. Dann könnte man das so umsetzen.
Delphi-Quellcode:
VAR
s, s2: STRING; List: TStringList; i, i2: Integer; arr: TArray<STRING>; BEGIN IF FileExists( ExtractFilePath( ParamStr( 0 ) ) + '\List.dat' ) THEN BEGIN List := TStringList.Create; TRY List.LoadFromFile( ExtractFilePath( ParamStr( 0 ) ) + '\List.dat' ); s := sl.Strings[0]; FOR i := 0 TO List.Count - 1 DO BEGIN arr := { uses System.StrUtils } SplitString( List.Strings[i], ',' ); FOR i2 := 0 TO HIGH( arr ) DO BEGIN s2 := ( arr[i2] ); IF s = s2 THEN BEGIN ShowMessage( 'OK' ); break; END; END; END; FINALLY List.Free; END; END; END; |
AW: String mit einer Datei abgleichen
Delphi-Quellcode:
jetzt werden die Zahlen im ShowMessage(s3) aus der Liste untereinandergeschrieben (aber alle Zahlen) das möchte ich auch nicht.
Ersetze s3 := StringReplace( List.Strings[i], ',', '', [rfReplaceAll] ); doch mal durch s3 := StringReplace( List.Strings[i], ',', sLineBreak, [rfReplaceAll] ); Wie sieht es jetzt aus?
if s2 = s3 then würde ich auch noch durch if Trim(s2) = Trim(s3) then ersetzen um bei dem Vergleich mögliche Leerzeichen zu ignorieren. ich habe eine Liste: 12345, 67891, 98765, 32165 wenn jetzt zum Beispiel : s2 = "67891" ist, soll in der Liste geprüft werden ob diese Zahl vorhanden ist? ja die Zahl : "67891" ist vorhanden! (ShowMessage (s3) = "67891") |
AW: String mit einer Datei abgleichen
Zitat:
die Liste sollte eigentlich so aussehen: 12345, 67891, 98756, 32656, usw. |
AW: String mit einer Datei abgleichen
Wenn ich es richtig verstanden habe, suchst Du in der Liste einen einmaligen und daher eindeutigen String.
Wieso benutzt Du nicht .find oder .IndexOf?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Liste : TStringList; Index : Integer; bGefunden : Boolean; begin Liste := TStringList.Create; try if OpenDialog1.Execute then begin Liste.LoadFromFile(OpenDialog1.FileName); end; // Findet den Eintrag nur mit dem Trennzeichen Label1.Caption := 'Der Suchstring ist in der Zeile: ' + IntToStr(Liste.IndexOf(Edit1.Text)); // Findet den Eintrag nur mit dem Trennzeichen bGefunden := Liste.Find(edit1.text,Index); if bGefunden then Label2.Caption := 'Der Suchstring ist in der Zeile: ' + IntToStr(Index) else Label2.Caption := 'Nicht gefunden'; // Meldet das erste gefundene Resultat // Findet auch Einträge, wenn das Trennzeichen nicht vorkommt // -> auch Teilstringe werden gefunden ('ab' -> 'abc,') // Allerdings musst Du hier mit einer Schleife arbeiten um sämtliche Einträge zu finden Liste.Find(edit1.text,Index); Label3.Caption := 'Der Suchstring ist in der Zeile: ' + IntToStr(Index); finally Liste.Free; end; end; |
AW: String mit einer Datei abgleichen
Zitat:
Schaue mir gleich mal Deinen Quelltext an. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 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