Ich weiß dieses Thema gab es schon desöfteren und ich hab auch schon über die Suche einige gefunden.
Das Script lief zwar vorher schon, bevor ich angefangen hab zu suchen, aber es war recht langsam.
Worum gehts: Das Script soll 2 Dateien miteinander vergleichen und Unterschiede in Datei 3 schreiben.
Dabei müssen verschiedene Dinge beachtet werden.
Es werden je 2 Werte aus der jeweiligen Datei gelesen; Pfad + Wert.
Diese Werte soll er mit einer neueren Version der Datei vergleichen.
Die Crux dabei ist nun, dass die Reihenfolge unterschiedlich sein kann.
Das bedeutet nun genau:
- Pfad + Wert aus Datei 1 lesen
- Pfad in Datei 2 suchen
- wenn gefunden, dann Werte vergleichen
- wenn unterschiedlich, dann in Datei 3 schreiben (sonst nichts)
- wenn gleich, dann nichts machen, sondern wieder zum Anfang springen (nächtsen Pfad + Wert aus Datei 1 lesen)
- wenn nicht gefunden, dann in Datei 3 schreiben
- wenn gefunden, dann Werte vergleichen
Der Aufbau beider Dateien ist identisch, hier mal ein Auszug:
7e2f19c75105047a0668b19ee620dcac *ace/ace_cp.deploy
cf4684fe0d4b39cb8edccf6ea4922e8d *ace/CM/bkg.png
e2d0b78edeafd93685b73733877aca10 *ace/CM/cmerrors.ace
fbe2f82503b07029d469959f2324425f *ace/CM/mdinfo.ace
Mein Script:
Spoiler anzeigen
#include <File.au3>
[/autoit] [autoit][/autoit] [autoit]Global $OldFile = "old.txt", $NewFile = "new.txt", $TargetLog = @ScriptDir & "\changes.txt"
Global $OldHandle, $NewHandle, $TargetHandle, $ChangeAmount, $OldLines, $NewLines, $OldCounter = 4, $NewCounter = 4, $OldData, $NewData
_FileCreate($TargetLog)
$OldHandle = FileOpen($OldFile, 0) ; current state file
$NewHandle = FileOpen($NewFile, 0) ; new state file
$TargetHandle = FileOpen($TargetLog, 2) ; difference file
_compareFiles()
[/autoit] [autoit][/autoit] [autoit];~ ProgressOn("test", "file")
[/autoit] [autoit][/autoit] [autoit]Func _compareFiles()
[/autoit] [autoit][/autoit] [autoit]$OldLines = _FileCountLines($OldFile)
$NewLines = _FileCountLines($NewFile)
While $OldCounter <= $OldLines
$OldData = StringSplit(FileReadLine($OldHandle, $OldCounter), "*")
$OldData[1] = StringTrimRight($OldData[1], 1)
;~ ProgressSet($OldCounter, $OldData[2])
_searchFile()
$OldCounter += 1
WEnd
Exit
EndFunc
Func _searchFile()
Local $match = 0
While $NewCounter <= $NewLines
$NewData = StringSplit(FileReadLine($NewHandle, $NewCounter), "*")
$NewData[1] = StringTrimRight($NewData[1], 1)
If $NewData[2] = $OldData[2] Then
$match = 1
Select
Case $OldData[1] = $NewData[1]
Case $OldData[1] <> $NewData[1]
FileWrite($TargetHandle, $NewData[2] & @CRLF)
ExitLoop
EndSelect
Else
$NewCounter += 1
EndIf
If $match = 0 And $NewCounter = $NewLines Then FileWrite($TargetHandle, $NewData[2] & @CRLF)
WEnd
EndFunc
Das funktioniert soweit auch, aber es scheint extrem langsam zu sein (das Script beendet sich selbst nach 10 Minuten nicht von selbst).
Nach 2 Minuten hat es gerade mal 2 Unterschiede gefunden (von Einträgen die unter den ersten 10 Zeilen sind).
Als generelle Info: Die Anzahl der Zeilen beider Dateien ist >3000.
Dennoch sollte es daran nicht liegen, da die CPU nicht mal 2% Auslastung hat...
Jemand Vorschläge zur Verbesserung? Hab ich vielleicht unnötige Dinge drin?
Grüße