Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   String mit einer Datei abgleichen (https://www.delphipraxis.net/211814-string-mit-einer-datei-abgleichen.html)

lucy 5. Nov 2022 12:59

String mit einer Datei abgleichen
 
Hallo,

würde gernen einen String mit einer Datei (Inhalt) vergleichen.

Delphi-Quellcode:
 List:= TStringList.Create;
      List.LoadFromFile(ExtractFilePath(ParamStr( 0 )) + '\List.dat');
       for i := 0 to List.Count - 1 do begin
       if sl.Strings[0] = List[i] then begin
ich habe eine Datei mit Zahlen zum Beispiel:

758,
326,
569

kommt einer diese drei Zahlen im String (sl.String[0]) vor dann ....

himitsu 5. Nov 2022 13:30

AW: String mit einer Datei abgleichen
 
Was ist deine Frage?


Einträge der Liste mit der ersten Zeile der Datei zu vergleichen und wenn gefunden, dann was machen, das macht du doch schon?

Willst du andersrum, etwas machen, wenn nicht drin, in einem Boolean merken wenn gefunden und nach der Schleife (nach allen Vergleichen) dann das auswerten,
oder, wie gesagt ... IndexOf.






Oder nicht nur mit der ersten Zeile vergleichen?

Wenn die Zahlen nicht in den selben Zeilen wie in der Liste stehen,
dann brauchst du per se zwei Schleifen, um jeden String in der Liste mit jeder Zeile der Datei zu vergleichen.

Oder eine Schleife und IndexOf (was den Wert mit jeder Zeile vergleicht).



Was ist "dann"?

Wenn neue Werte in Liste einfügen/angängen und "doppelte" ignorieren,
dann kennt eine StringList such etwas bezüglich "Duplicate ignore" und man kann somit einfach ALLES per Add/AddStrings hinzufügen, weil Doppeltes automatisch wegfliegt.

lucy 5. Nov 2022 15:01

AW: String mit einer Datei abgleichen
 
ach ja mein Problem :-) richtig in der Datei wird nur die erste Zeile gelesen.
brauche eine Schleife um alle Zeilen zu lesen.

wie könnte so eine Schleife aussehen?

blawen 5. Nov 2022 16:41

AW: String mit einer Datei abgleichen
 
Zitat:

Zitat von lucy (Beitrag 1514363)
ach ja mein Problem :-) richtig in der Datei wird nur die erste Zeile gelesen.
brauche eine Schleife um alle Zeilen zu lesen.

wie könnte so eine Schleife aussehen?

Kommen die Werte auch Mehrfach vor?

Grundsätzlich sollte Dir
Delphi-Quellcode:
List.find('Suchstring', Index)
weiterhelfen.
Zitat:

function Find(const S: string; var Index: Integer): Boolean; virtual;

Sucht in einer sortierten Liste den Index eines Strings und gibt an, ob bereits ein String mit diesem Wert vorhanden ist.


lucy 5. Nov 2022 18:24

AW: String mit einer Datei abgleichen
 
Zitat:

Kommen die Werte auch Mehrfach vor?
nein, die Werte sind einmalig in der Datei.

bin noch am experimentieren

habe noch keine Lösung, dass ist auch falsch, glaube ich

Delphi-Quellcode:
     List:= TStringList.Create;
       List.LoadFromFile(ExtractFilePath(ParamStr( 0 )) + '\List.dat');
        for i := 0 to List.Count - 1 do begin
         if Index = List.IndexOf(sl.Strings[0]) then begin

juergen 5. Nov 2022 21:45

AW: String mit einer Datei abgleichen
 
Der Code sollte doch funktionieren. Daher vermute ich, dass in der List.dat-Datei ein Komma ist und in sl.Strings[0] nicht?

Probiere mal folgendes.
Delphi-Quellcode:
 
VAR
  s, s2: STRING;
  List: TStringList;
  i: Integer;
BEGIN
IF FileExists( ExtractFilePath( ParamStr( 0 ) ) + '\List.dat' ) THEN
  BEGIN
    s := sl.Strings[0];
    ShowMessage( s );  
    List := TStringList.Create;
    TRY
      List.LoadFromFile( ExtractFilePath( ParamStr( 0 ) ) + '\List.dat' );
      FOR i := 0 TO List.Count - 1 DO
      BEGIN
        s2 := StringReplace( List.Strings[i], ',', '', [rfReplaceAll] );
        ShowMessage( s2 );
        IF s = s2 THEN
        BEGIN
          // hier das was du machen willst
          break;
        END;
      END;
    FINALLY
      List.Free;
    END;
  END;
END;
Aber eigentlich sollte das alles beim debuggen ersichtlich sein.

lucy 6. Nov 2022 08:50

AW: String mit einer Datei abgleichen
 
Liste der Anhänge anzeigen (Anzahl: 1)
die Zahlen stehen untereinander, es wird immer nur die erste Zeile gelesen :-( warum????

zeras 6. Nov 2022 08:53

AW: String mit einer Datei abgleichen
 
Das Komma gehört auch zum String. Ist das vielleicht dein Problem?

juergen 6. Nov 2022 09:05

AW: String mit einer Datei abgleichen
 
Da ich das Komma als Problem vermutet hatte, hatte ich StringReplace() vorgeschlagen.
Wenn du meinen Code anwendest:
Wie oft erscheint die Showmessage mit s2 ?
Und was genau steht eigentlich in s?

lucy 6. Nov 2022 09:26

AW: String mit einer Datei abgleichen
 
Zitat:

Da ich das Komma als Problem vermutet hatte, hatte ich StringReplace() vorgeschlagen.
Wenn du meinen Code anwendest:
Wie oft erscheint die Showmessage mit s2 ?
Und was genau steht eigentlich in s?
zu (1) habe beide Varianten mit und ohne [,] ausprobiert

zu (2) Showmessage s2 wird einmal angezeigt

zu (3) es wird immer nur eine Zahl angezeigt zum Beispiel : 1234

habe das Gefühl, als würde aus der Datei immer nur die erste Zeile gelesen

lucy 6. Nov 2022 09:30

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;

IMPEGA 6. Nov 2022 09:31

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.

lucy 6. Nov 2022 09:53

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:
   s3 := StringReplace( List.Strings[i], ',', '', [rfReplaceAll] );
        ShowMessage(s3);
ist = ShowMessage(s3) = "12345 6789"

soll = ShowMessage(s3) ist falsch! es müsste "12345" heißen

zeras 6. Nov 2022 10:10

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.

ringli 6. Nov 2022 10:20

AW: String mit einer Datei abgleichen
 
Ersetze
Delphi-Quellcode:
s3 := StringReplace( List.Strings[i], ',', '', [rfReplaceAll] );
doch mal durch
Delphi-Quellcode:
s3 := StringReplace( List.Strings[i], ',', sLineBreak, [rfReplaceAll] );
Wie sieht es jetzt aus?

Delphi-Quellcode:
if s2 = s3 then
würde ich auch noch durch
Delphi-Quellcode:
if Trim(s2) = Trim(s3) then
ersetzen um bei dem Vergleich mögliche Leerzeichen zu ignorieren.

juergen 6. Nov 2022 10:53

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;

lucy 6. Nov 2022 11:04

AW: String mit einer Datei abgleichen
 
Delphi-Quellcode:
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.
jetzt werden die Zahlen im ShowMessage(s3) aus der Liste untereinandergeschrieben (aber alle Zahlen) das möchte ich auch nicht.

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")

lucy 6. Nov 2022 11:14

AW: String mit einer Datei abgleichen
 
Zitat:

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.
ich habe immer beide Varianten getestet! ist natürlich verwirrend :-(

die Liste sollte eigentlich so aussehen:

12345,
67891,
98756,
32656,
usw.

blawen 6. Nov 2022 13:07

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;

lucy 6. Nov 2022 13:13

AW: String mit einer Datei abgleichen
 
Zitat:

Wenn ich es richtig verstanden habe, suchst Du in der Liste einen einmaligen und daher eindeutigen String.
Ja!

Schaue mir gleich mal Deinen Quelltext an.

juergen 6. Nov 2022 17:37

AW: String mit einer Datei abgleichen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe mal beide Varianten (pro Zahl eine Zeile mit Komma am Ende und alle Zahlen kommagetrennt in 1 Zeile) in ein hier Testprojekt angehangen.

Was ist bei dir nun anders, dass es bei dir nicht funktioniert?
Beachte List1.dat und List2.dat

lucy 7. Nov 2022 08:46

AW: String mit einer Datei abgleichen
 
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:

Habe mal beide Varianten (pro Zahl eine Zeile mit Komma am Ende und alle Zahlen kommagetrennt in 1 Zeile) in ein hier Testprojekt angehangen.

Was ist bei dir nun anders, dass es bei dir nicht funktioniert?
Beachte List1.dat und List2.dat
hat die Fehlermeldung was mit meiner Delphi - Version XE7 zu tun?

juergen 7. Nov 2022 09:22

AW: String mit einer Datei abgleichen
 
Da wird deine Version das TArray<STRING> wohl noch nicht unterstützen.
Genau aus diesem Grunde sollte man seine Delphiversion in seinem Profil hinterlegen.

juergen 7. Nov 2022 09:24

AW: String mit einer Datei abgleichen
 
—-doppelter Post—-, gelöscht

lucy 7. Nov 2022 11:09

AW: String mit einer Datei abgleichen
 
Zitat:

Genau aus diesem Grunde sollte man seine Delphiversion in seinem Profil hinterlegen.
"wurde geändert" :)

himitsu 7. Nov 2022 12:11

AW: String mit einer Datei abgleichen
 
Ohh, eine Starter.

https://www.embarcadero.com/de/products/delphi/starter

Zu beachten: Die neuen Lizenzen sind nur noch ein Jahr gültig und müssen dann aktualisiert werden, sonst startet Delphi nicht mehr.
Und die neue CE-Lizenz ist auch nur mit der jeweils aktuellen Version gültig.

Keine Angst, deine alte Starter-Lizenz bleibt weiterhin (nahezu) unbegrenz gültig.

hhcm 7. Nov 2022 13:25

AW: String mit einer Datei abgleichen
 
Ist es nicht einfacher mit DelimitedText bzw. Commatext zu arbeiten?

Delphi-Quellcode:
 
  Liste := TStringList.Create;
  try
    // Entweder DelimitedText
    Liste.Delimiter := ',';
    Liste.DelimitedText := TFile.ReadAllText('List.dat');

    // Oder in diesem Fall noch einfacher CommaText
    Liste.CommaText := TFile.ReadAllText('List.dat');    

    // Mach was mit Liste
  finally
    Liste.Free;
  end;
Da sollte es egal sein, ob die Datei

So
---
12345,
4711,
0815

Oder so
---
12345,4711,0815

aufgebaut ist.
Ob es TFile bzw. ioutils bereits in XE7 gab weiss ich nicht.
Falls nicht, es gibt genügend Möglichkeiten eine Datei auszulesen.

himitsu 7. Nov 2022 13:40

AW: String mit einer Datei abgleichen
 
Bei DelimitedText unbedingt auf StrictDelimiter=True achten, denn Leerzeichen, Tabs und so werden sonst ebnfalls als Delimiter angesehn. (war wieder mal 'ne saublöde Idee das so zu "reparieren", anstatt es richtig zu machen, bzw. dieses "kaputte" Verhalten standardmäßig abzuschalten)

hhcm 7. Nov 2022 16:07

AW: String mit einer Datei abgleichen
 
Zitat:

Zitat von himitsu (Beitrag 1514439)
Bei DelimitedText unbedingt auf StrictDelimiter=True achten, denn Leerzeichen, Tabs und so werden sonst ebnfalls als Delimiter angesehn.

Mit StrictDelimiter wird eine Datei mit Zeilenumbrüchen total verhunzt. Ohne gehts.

himitsu 7. Nov 2022 16:33

AW: String mit einer Datei abgleichen
 
Nja, kommt drauf an, was man will.

An Komma und/oder Zeilenumbruch/Leerzeichen getrennt, dann vielleicht ja, mit dem False.

Code:
abc,def,xy z,123
soll das zu
Code:
abc
def
xy z
123
oder
Code:
abc
def
xy
z
123
werde?

Meistens ja Ersteres,
denn wenn ich sage "am komma trennen", dann will ich es meistens auch "nur" am Komma getrennt haben. :angle2:

Wenn ich dagegen, bei den anderen Split-Funktionen, mehrere Trennzeichen ala
Delphi-Quellcode:
', '
angebe, dann ist es schon klar, dass ich da auch Beides getrennt haben will.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 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