Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Stringlisten vergleichen (https://www.delphipraxis.net/210761-stringlisten-vergleichen.html)

creehawk 6. Jun 2022 13:04

Stringlisten vergleichen
 
Moin Moin.

Ich möchte muss 2 Listen vergleichen um herauszufinden was in der einen Liste fehlt

Delphi-Quellcode:
var
I,II:Integer;
Str : String;
CurrentList : TStringlist;
DDSList    : TStringList;
CopyList   : TstringList;
begin
  Currentlist := TStringlist.Create;
  DDSList    := TStringlist.Create;
  CopyList := TStringlist.Create;
  CurrentList.LoadFromFile(TMPPath + 'CurrentDivFiles.txt'); // 3049 Zeilen ex. G:\Files\dds\....Dateiname
  DDSList.LoadFromFile(TMPPath + 'DDSList.txt');            // 3293 Zeilen ex. icon_crops_diversity_2_dark_0.dds
  for i := 0 to CurrentList.Count -1 do
   begin
    STR := CurrentList.Strings[I];
    for II := 0 to DDSList.count -1 do
      begin
       if AnsiPos(STR,DDSList.Strings[II]) = 0 then CopyList.add(DDSList.Strings[II]);
      end;
   end;
   CopyList.SavetoFile(TMPPath + 'CopyList.txt');
end;
Alles läuft bis zu dem Moment wo ich CopyList speichern will : Zuwenig Arbeitsspeicher. Was??

Kann mir jemand auf die Sprünge helfen?

creehawk

zeras 6. Jun 2022 13:26

AW: Stringlisten vergleichen
 
Ich hätte das vielleicht anders umgesetzt.
Nimm die Funktion IndexOf, dann siehst du, ob der String schon in der Liste drin ist.

DeddyH 6. Jun 2022 13:28

AW: Stringlisten vergleichen
 
Und wo werden die StringListen wieder freigegeben?

creehawk 6. Jun 2022 13:35

AW: Stringlisten vergleichen
 
IndexOf ......

Wie macht man das richtig?:oops:


Freigegeben? Wenn ich die beiden - Current und DDS - VOR dem speichern der CopyList freigebe (Free) ändert das nicht am OutofMemory....

creehawk

Ausserdem : die beiden Dateien sind zusammen 400 KB groß.... OutOfMemory?

creehawk 6. Jun 2022 13:40

AW: Stringlisten vergleichen
 
Ich habe jetzt mal anstell des schreibens in die CopyList das ausgeben lassen in ein Memofeld auf der Form.

Das läuft und läuft - ein Eintrag nach dem anderen...

Eigentlich sollte doch die Zeile AnsiPos nur dann in die Memo/Stringlist schreiben wenn er den Eintrag nicht findet.

Irgendwas ist im Konstrukt faul. Aber was zum Teufel?

creehawk

zeras 6. Jun 2022 13:41

AW: Stringlisten vergleichen
 
Du lädst einfach die Liste und prüfst, ob ein String dort schon enthalten ist oder nicht.

Delphi-Quellcode:
SL.Loadfromfile('deineliste.txt');

If SL.IndexOf('deineSuche') = -1 then begin
  //dann mache was mit 'deineSuche'
end;

DeddyH 6. Jun 2022 13:42

AW: Stringlisten vergleichen
 
Verstehe ich das richtig: Du willst die Zeilen der einen Datei ermitteln, die in der anderen nicht vorkommen?

[edit] @zeras: IndexOf gibt einen Integer zurück, keinen Boolean ;-) [/edit]

[edit2] Falls ich das richtig verstanden habe, könnte man das ja auch ohne 3. Liste umsetzen (ungetestet):
Delphi-Quellcode:
var
  Gross: TStringList;
  Klein: TStringList;
  i: integer;
begin
  Klein := nil;
  Gross := TStringList.Create;
  try
    Klein := TStringList.Create;
    Klein.LoadFromFile(...);
    Gross.LoadFromFile(...);
    for i := Gross.Count - 1 downto 0 do
      if Klein.IndexOf(Gross[i]) >= 0 then
        Gross.Delete(i);
    Gross.SaveToFile(...);
  finally
    Klein.Free;
    Gross.Free;
  end;
end;
[/edit2]

creehawk 6. Jun 2022 13:59

AW: Stringlisten vergleichen
 
Tja, jetzt ist die CopaList so gross wie die Currentlist....

Hatte ich nicht irgendwo gelesen das IndexOf nur ein ganzen Stringvergleich macht? In der Currentlist stehen aber nur die Dateinamen, in der DDSList die Dateinamen MIT den Pfaden....

creehawk

zeras 6. Jun 2022 14:02

AW: Stringlisten vergleichen
 
Zitat:

Zitat von creehawk (Beitrag 1506829)

Hatte ich nicht irgendwo gelesen das IndexOf nur ein ganzen Stringvergleich macht? In der Currentlist stehen aber nur die Dateinamen, in der DDSList die Dateinamen MIT den Pfaden....

creehawk

Ja, das musst du aber mit dazuschreiben. Das haben wir leider nicht aus den Informationen herauslesen können.

creehawk 6. Jun 2022 14:10

AW: Stringlisten vergleichen
 
Okay, tut mir leid, war vielleicht nicht deutlich genug, aber in der ersten Post stehten zwei Beispiele drin im Delhi Code.

Es sollte aber funktionieren wenn ich die Listen angleiche. Das mache ich mal.

Trotzdem: Warum OutOfMemory?

creehawk

creehawk 6. Jun 2022 14:19

AW: Stringlisten vergleichen
 
So, funktioniert anstandlos und zügig.

Aber warum geht mein Kunstwerk von oben nicht. Okay, mit IndexOf geht es nicht. Also dachte ich eben wenn ich frage, ob der String (also der Dateiname) in dem anderen String(s) enthalten ist oder nicht das er wenn nicht diesen String in die neue Liste schreibt.

SackerlZement.

creehawk

juergen 6. Jun 2022 14:22

AW: Stringlisten vergleichen
 
Ausgehend vom Code aus Post #1 und der Bemerkung , dass eine Liste den gesamten Pfad enthält. und die andere Liste nur die Dateinamen, sind in deiner CopyList ca. 9.6 Mio Zeilen. Ist dir das bewusst?

creehawk 6. Jun 2022 14:23

AW: Stringlisten vergleichen
 
Aha, 9.6 Mill Zeilen. Und das ist mir jetzt nicht bewusst.

Ich sage ja, da ist was faul. Und jetzt: WAS?

creehawk

juergen 6. Jun 2022 14:26

AW: Stringlisten vergleichen
 
Da dein Vergleich *nie* stimmt, fügst du 3049 * 3293 Zeilen der CopyList hinzu.

zeras 6. Jun 2022 14:30

AW: Stringlisten vergleichen
 
Versuche doch mal zum Test, deine Dateien so zu kürzen, damit du nur 2-3 Zeilen hast. Dann wirst du bestimmt sehen, was Jürgen meint.

himitsu 6. Jun 2022 14:32

AW: Stringlisten vergleichen
 
IndexOf und Find nutzen die interne Vergleichsmethode,
welche man natürlich auch überschreiben und somit ändern kann.
Delphi-Referenz durchsuchenTStringList.CompareStrings

z.B. mit einem ExtractFileName




und bei canz vielen ADD könnte man vorher noch Capacity setzen.

creehawk 6. Jun 2022 14:33

AW: Stringlisten vergleichen
 
Wie gesagt also, erste Post:

If AnsiPos(STR,DDSList.Strings[II]) = 0 dann aufschreiben

Wenn der STR (also ein Dateiname) im aktuellen String der DDSList NICHT enthalten ist dann...

Aja, natürlich. :(

Das muss ich jetzt erstmal ventilieren.

creehawk

creehawk 6. Jun 2022 14:48

AW: Stringlisten vergleichen
 
So, kurzer Überschlag, jetzt habe ich das verstanden.

Bevor ich mich nun in mein Schwert stürze wegen verschärfter Begriffstutzigkeit :wall: möchte ich mich für die Hilfestellungen bedanken.

Ade, du schnöde Programmierwelt.

creehawk

himitsu 6. Jun 2022 15:02

AW: Stringlisten vergleichen
 
Zitat:

Warum OutOfMemory
Wo?


Beim Laden einer Datei in eine TStringList braucht man vorübergehend bis zum 5-fachen der Dateigröße.
Und das Doppelte bis Dreifache auch noch an einem Stück, was bei 32 Bit effektiv durchschnittlich nur bis zu 800MB sind.


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