Delphi-PRAXiS
Seite 5 von 6   « Erste     345 6      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   File compare (https://www.delphipraxis.net/160642-file-compare.html)

himitsu 24. Mai 2011 18:03

AW: File compare
 
nicht nur grusselig...
Delphi-Quellcode:
... to vlxsysstate_functions.s3.Count -1 do
        Writeln(s3[i2]);
    test_functions.s3
Drei verschiedene Pfade für s3 ... sicher daß es nur das eine s3 gibt?

Es predigen nicht umsonst soviele, daß globale Variablen "böse" sind und man lieber auf Parameter umsteigen sollte.

Bjoerk 24. Mai 2011 18:39

AW: File compare
 
Sollte funktionieren..
Delphi-Quellcode:
function CompareTextFiles (const file1, file2: string): integer;
var
  s1, s2: string;
  f1, f2: TextFile;
  Count: integer;
begin
  Result:= -1;
  if LowerCase(file1) <> LowerCase(file2) then
  begin
    AssignFile (f1, File1);
    {$I-} Reset(f1); {$I+}
    if IoResult = 0 then
    begin
      AssignFile (f2, File2);
      {$I-} Reset(f2); {$I+}
      if IoResult = 0 then
      begin
        Count:= 0;
        Result:= 0;
        while ((not Eof(f1)) and (not Eof(f2)) and (Result = 0)) do
        begin
          Readln(f1, s1);
          Readln(f2, s2);
          Inc(Count);
          if s1 <> s2 then Result:= Count;
        end;
        if Result = 0 then
          if ((not Eof(f1)) or (not Eof(f2))) then Result:= Count+1;
        closeFile (f2);
      end;
      closeFile (f1);
    end;
  end;
end;

blauweiss 24. Mai 2011 18:41

AW: File compare
 
Zitat:

Zitat von p80286 (Beitrag 1102640)
Ins unreine gedacht,
für jede Zeile einen Hash-wert erstellen und gleiche Zeilen/Hash-werte aus dem Topf entfernen.
Was übrig bleibt ist nicht gleich.

Gruß
K-H

Die beste Idee IMHO.
Ich hab's mal quasi genauso programmiert, nur andersrum 8-)

Delphi-Quellcode:
procedure GetListDifferences(StringListMaster, StringListToCheck: TStringList;
                             var AddedList, MissingList: TStringList);
var
  i: integer;
begin
  AddedList.Clear;
  for i := 0 to StringListToCheck.Count-1 do
    if (StringListMaster.IndexOf(StringListToCheck[i]) = -1) then
      AddedList.Append(StringListToCheck[i]);
  MissingList.Clear;
  for i := 0 to StringListMaster.Count-1 do
    if (StringListToCheck.IndexOf(StringListMaster[i]) = -1) then
      MissingList.Append(StringListMaster[i]);
end;

procedure GetTextFileDifferences(FileNameMaster, FileNameToCheck: string;
                                 var AddedList, MissingList: TStringList);
var
  StringListMaster, StringListToCheck: TStringList;
begin
  AddedList.Clear;
  MissingList.Clear;
  if not FileExists(FileNameMaster) or not FileExists(FileNameToCheck) then
    exit;
  StringListMaster := TStringList.Create;
  StringListToCheck := TStringList.Create;
  try
    StringListMaster.LoadFromFile(FileNameMaster);
    StringListToCheck.LoadFromFile(FileNameToCheck);
    GetListDifferences(StringListMaster, StringListToCheck, AddedList, MissingList);
  finally
    StringListMaster.Free;
    StringListToCheck.Free;
  end;
end;
Gruss,
blauweiss

value is NULL 24. Mai 2011 18:51

AW: File compare
 
@ blauweiss

könntest du mir das etwas erklären?! nur fürs verständnis :)
ich verstehe das nämlich so überhaupt nicht, was bekomme ich da als result?

der plan ist nämlich als Result immer den Text der betroffenen Zeilen zu erhalten.

sry falls die Frage blöd rüber kommt aber das ist neuland :(

LG

DeddyH 24. Mai 2011 19:00

AW: File compare
 
Ob Hash oder die Zeile selbst dürfte doch aus Logiksicht egal sein. Nimm Dir also eine Zeile aus der ersten Datei, suche sie in der zweiten und lösche sie bei Fund aus beiden Stringlisten. Das machst Du Zeile für Zeile, was am Schluss übrig bleibt sind die Unterschiede.

blauweiss 24. Mai 2011 19:09

AW: File compare
 
Zitat:

Zitat von DeddyH (Beitrag 1102704)
Ob Hash oder die Zeile selbst dürfte doch aus Logiksicht egal sein. Nimm Dir also eine Zeile aus der ersten Datei, suche sie in der zweiten und lösche sie bei Fund aus beiden Stringlisten. Das machst Du Zeile für Zeile, was am Schluss übrig bleibt sind die Unterschiede.

Genau !
Oder einfach andersrum, wie bei mir: Die nicht gefundenen (=unterschiedlichen) werden gesucht.

@value is NULL:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  AddedList, MissingList: TStringList;
begin
  AddedList := TStringList.Create;
  MissingList := TStringList.Create;
  try
    GetTextFileDifferences('C:\Alt.txt', 'C:\Neu.txt', AddedList, MissingList);

    ...AddedList enthält jetzt die Einträge von Neu.txt, die nicht in Alt.txt sind
    ...MissingList enthält die Einträge von Alt.txt, die nicht in Neu.txt sind

  finally
    AddedList.Free;
    MissingList.Free;
  end;
end;
Gruss
blauweiss

value is NULL 24. Mai 2011 19:18

AW: File compare
 
ah ok, hab das prinzip jetzt verstanden, habe glaube ich zu kompliziert gedacht.

Thank good for the Stringlist xD

LG

FredlFesl 24. Mai 2011 19:23

AW: File compare
 
Dafür gibt es doch die Programme Kdiff, Beyondcompare usw. Die dahinterliegenden Algorithmen sind zwar bekannt, aber nicht trivial.

Bisserl Schmalz muss man schon verwenden, aber man kann mit der Levenshtein-Distanz rechnen, nur nicht auf Zeichen- sondern auf Zeilenebene.

blauweiss 24. Mai 2011 19:43

AW: File compare
 
Zitat:

Zitat von FredlFesl (Beitrag 1102711)
Dafür gibt es doch die Programme Kdiff, Beyondcompare usw. Die dahinterliegenden Algorithmen sind zwar bekannt, aber nicht trivial.

Bisserl Schmalz muss man schon verwenden, aber man kann mit der Levenshtein-Distanz rechnen, nur nicht auf Zeichen- sondern auf Zeilenebene.

Das geht sogar mit Sicherheit ! Jedes beliebig triviale Problem läßt sich mit beliebig großem Aufwand unter Verwendung beliebig vieler nichttrivialer Algorithmen lösen ! Und das kostet dann richtig Gehirnschmalz, Du hast Recht.

Levenshteindistanzfreundliche Grüße,
blauweiss

FredlFesl 24. Mai 2011 20:02

AW: File compare
 
Sachma, hast du überhaupt kapiert, was ich geschrieben habe?
Was soll der Blödsinn?

Wenn es hier um einen Vergleich von zwei Textdateien geht, bei denen die Unterschiede gezeigt werden sollen, wie würdest Du da vorgehen?
Erst einen reinkippen, bist du BLAU bist, und dann "ich WEISS nicht" brüllen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr.
Seite 5 von 6   « Erste     345 6      

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