Gemischte Ini-Datei updaten - Ideen gesucht

  • Nicht die Soll.ini und die Ist.Ini vergleichen, sondern die Ist.ini und die Ergebnis.ini. Könnte das funktionieren? Falls ja, wie gehts am schnellsten: Zeilenweise vergleichen (Dateien befinden sich ja schon im RAM), oder gibts dafür auch eine RegExe, die mit 32+ KB zurechtkommt?

    Da ich diesen Thread nur so am Rande verfolge, habe ich kein genaues Bild vor Augen, was in welcher .ini steht, und was, wie miteinander verglichen werden kann/soll.

    StringRegExp untersucht einen String, und da die MAX_STRINGLEN in AutoIt 2.147.483.647 beträgt, sollten 32+KB kein Problem darstellen.

    Sind die Ist.ini und die Ergebnis.ini vom Aufbau der Keys identisch, d.h. unterscheiden sie sich ggf. nur bei den Werten ?

    Ist eine .ini eine Teilmenge der anderen ?

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hier mal ein stark vereinfachtes Muster :

    Erste .ini :

    Key1=ValueA

    Key2=ValueB

    Key3=ValueC

    Key4=ValueD

    Key5=ValueE

    Zweite .ini (Aufbau identisch zur ersten .ini) :

    Key1=ValueA

    Key2=ValueB

    Key3=ValueXXX <- Unterschied zur ersten .ini

    Key4=ValueD

    Key5=ValueE

    Zweite .ini (Teilmenge der ersten .ini) :

    Key1=ValueA

    Key3=ValueXXX <- Unterschied zur ersten .ini

    Key5=ValueE

    Kann die zweite .ini Elemente enthalten, die in der ersten nicht vorkommen ?, also z.B. :

    Key1=ValueA

    Key3=ValueXXX <- Unterschied zur ersten .ini

    Key8=ValueH

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • AspirinJunkies Code bereitet die Ist.ini auf und benutzt als Grundlage die Soll.ini. Daraus resulitiert die Ergebnis.ini.

    Kurz gesagt, am Ende geht es also um die Ist.ini und die Ergebnis.ini.

    • Unterscheiden sich die beiden Inis, soll der Inhalt der Ergebnis.ini den Inhalt der Ist.ini ersetzen.
    • Sind beide Inis gleich, soll nicht geschrieben werden.

    Somit scheint mir die Lösung zu sein, die Ergebnis.ini mit der Ist.ini zu vergleichen.? ZIel: Sind beide Inis absolut gleich? Die Prüfung ist eine strikt einfache: Gibt es irgendeinen Unterschied zwischen beiden Inis? Es braucht also nichts besonderes geprüft zu werden, also z.B. ob der Schlüssel X in der einen Ini den gleichen Wert wie in der anderen hat, usw. Selbst wenn Schlüssel X in beiden Inis vorhanden ist, aber an unterschiedlichen Stellen, gilt das als unterschiedlich. Wenn in einer der beiden Inis ein/e Leerzeichen/Leerzeile mehr/weniger als in der anderen ist, gilt das als unterschiedlich. usw.

    Daraus resultiert die Frage, wie macht man das am schnellsten

    • Beide Inis in Arrays laden und zeilenweise vergleichen?
    • Beide Inis in Dictionaries laden und vergleichen?
    • Muss man Arrays, bzw. Dicts unbedingt iterieren, oder gibt es einfacher/schnellere Methoden?
    • Könnte man beide Inis als Strings vergleichen? If $String_1 = $String_2 Then Oder geht das bei 30 KB in die Hose?
    • Gibt es andere Methoden, die beiden (im RAM bedindlichen) Inis zu vergleichen?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    2 Mal editiert, zuletzt von Professor Bernd (24. April 2021 um 00:07)

  • Somit scheint mir die Lösung zu sein, die Ergebnis.ini mit der Ist.ini zu vergleichen.? ZIel: Sind beide Inis absolut gleich? Die Prüfung ist eine strikt einfache: Gibt es irgendeinen Unterschied zwischen beiden Inis? Es braucht also nichts besonderes geprüft zu werden,

    Also doch ein 'simpler' Vergleich ;).

    Könnte man beide Inis als Strings vergleichen? If $String_1= $String_2 Then Oder geht das bei 30 KB in die Hose?

    Wenn beide Ini's als String vorliegen, dann sollte das gehen (die 30 KB spielen keine Rolle).

    Ggf. könnte man auch zu jedem String mittels _WinAPI_HashString einen Wert bilden und diese vergleichen.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Wenn beide Ini's als String vorliegen, dann sollte das gehen (die 30 KB spielen keine Rolle).

    Ich habe testweise 2 Strings der Länge 500.000 Chars verglichen -> geht schnell und problemlos !

    Um auch Groß/Kleinschreibung zu berücksichtigen solltest Du aber If $String_1 == $String_2 Then verwenden.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Also doch ein 'simpler' Vergleich ;) .

    Falls du das meinst:

    Solange es nur grundsätzlich darum geht, ob sich die Soll.ini und die Ist.ini unterscheiden (nicht wo),

    dann unbedingt ein simpler Vergleich. :) Nur dass nicht Soll.ini<>Ist.ini verglichen werden, sondern Ist.in<>Ergebnis.ini. Das hatte ich am Anfang übersehen.

    Für Hashes sehe ich hier keinen Vorteil, eher einen Nachteil, weil die glaube ich nicht für Schnelligkeit stehen.

    Ich habe testweise 2 Strings der Länge 500.000 Chars verglichen -> geht schnell und problemlos !

    Um auch Groß/Kleinschreibung zu berücksichtigen solltest Du aber If $String_1 == $String_2 Then verwenden.

    Das sollte hinhauen. Als Orientierung habe ich die schon etwas größere PSPad.ini genommen, die mit über 1.500 Zeile etwa 32.000 Zeichen "auf die Waage bringt". Das wären noch nicht annähernd 10% deiner getesteten 500.000 Zeichen, was also praktisch funktionieren sollte und sogar viel Luft nach oben hat.

    Trotzdem nochmal die Frage, ob ein Vergleich mit anderen Methoden schneller wäre, wie z.B. die, die ich In Posting #43 aufgezählt habe.

    Danke für den Tipp mit dem case sensitive Vergleich. Das hatte ich noch nicht bedacht. 8)

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Für Hashes sehe ich hier keinen Vorteil, eher einen Nachteil, weil die glaube ich nicht für Schnelligkeit stehen.

    Die Hashes bringen in der Tat keinen Vorteil (wäre nur eine Option gewesen, falls es anders nicht geht).

    Trotzdem nochmal die Frage, ob ein Vergleich mit anderen Methoden schneller wäre, wie z.B. die, die ich In Posting #43 aufgezählt habe.

    Ich habe beide 500 KB TestINI's vorher sogar erst noch mit FileRead eingelesen und erst dann verglichen. Das ging praktisch ohne Verzögerung. Von daher kann man sich den Vergleich mit den anderen Methoden wahrscheinlich sparen, aber das kannst Du ja selbst testen ;).

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Fällt mir gerade ein: Funktioniert ein case sensitive Stringvergleich auch bei ausländischen Zeichen? Zum Beispiel:

    LogWinTitel=البحث في البرامج والملفات

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Ich habe mal Deine Ist.ini als Basis sowohl für String1 als auch String2 verwendet und diese verglichen :

    Ergebnis => identisch

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Problem: Ich habe die Soll.ini kopiert und umbenannt zu Ist.ini, dann lediglich ein Zeichen hinzugefügt => damit sind sie also unterschiedlich (was WinMerge auf anzeigt). Leider meint der Stringvergelich, dass beide identisch sind.

    Ich habe nun mit großen (280 KB) Inis getestet und mit kleinen (1 KB), das Ergebnis ist immer "identisch". Was mache ich falsch? :/

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Fällt mir gerade ein: Funktioniert ein case sensitive Stringvergleich auch bei ausländischen Zeichen?

    Verwende ich z.B. bei Bulgarisch in String1 den Großbuchstaben Ѫ und bei String2 den entsprechenden Kleinbuchstaben ѫ , dann zeigt der Vergleich mit == korrekt an ==> nicht identisch

    Enthalten beide Strings den Großbuchstaben, dann => identisch

    Das sollte also funktionieren :).

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Problem: Ich habe die Soll.ini kopiert und umbenannt zu Ist.ini, dann lediglich ein Zeichen hinzugefügt => damit sind sie also unterschiedlich (was WinMerge auch anzeigt). Leider meint der Stringvergleich, dass beide identisch sind.

    Ich habe nun mit großen (280 KB) Inis getestet und mit kleinen (1 KB), das Ergebnis ist immer "identisch". Was mache ich falsch? :/

    Poste mal die beiden kleinen .ini's

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Mach dir mal im Moment nicht weiter Arbeit, vielleicht funktioniert alles, aber ich kriege gerade nicht mehr auf die Reihe, wann die Ist.ini geändert wird und wann nicht und wann das in der Ergebnis.ini auftaucht und wann nicht und ... . :Face:Muss jetzt :sleeping: und morgen wieder frisch drangehen.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Mach dir mal im Moment nicht weiter Arbeit, vielleicht funktioniert alles, aber ich kriege gerade nicht mehr auf die Reihe, wann die Ist.ini geändert wird und wann nicht und wann das in der Ergebnis.ini auftaucht und wann nicht und ... . :Face: Muss jetzt :sleeping: und morgen wieder frisch drangehen.

    Sicher ein guter Plan - schlaf gut ;)

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hier, falls Du es mal brauchst, mein quick & dirty Testskript :

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Die Frage wäre: Sollen die beiden Ini-Dateien direkt zeichenweise gleich sein oder nur inhaltlich?

    Z.B. richtet sich die Reihenfolge der Sections nach der aus der Soll.ini.
    Wenn in der Ist.ini jedoch z.B. [General] vor [Config] kommt und das in der Soll.ini andersherum ist, dann wird ein Stringvergleich einen Unterschied bringen obwohl alle Werte gleich sind.

    Um also einen Stringvergleich mit einzubauen muss man nur die Return-Zeile ändern zu: Return SetExtended($sRet <> $sIst, $sRet)

    Dann kann man mit @extended prüfen ob es eine Änderung gab oder eben nicht.

    Man könnte aber auch andersherum rangehen: Schauen ob es inhaltliche Änderungen an der Soll.ini gegeben hat.
    Denn nur wenn die Soll.ini sich von der Ist.ini unterscheidet, dann wird die Ergebnis.Ini sich inhaltlich von der Ist.ini unterscheiden.
    Diesen Check auf inhaltliche Änderungen an der Soll.ini habe ich mal mit in die Funktion eingebaut (wieder über @extended abfragbar).

    Ansonsten noch ein wichtiger Hinweis zu dem was die Funktion macht: Sie nimmt die Soll.ini und schaut ob deren Inhalte andere Werte in der Ist.ini haben.
    Was sie nicht macht: Sie ergänzt die Soll.ini nicht um Werte oder gar Sektionen welche nur in der Ist.ini stehen und nicht in der Soll.ini.

  • Die Frage wäre: Sollen die beiden Ini-Dateien direkt zeichenweise gleich sein oder nur inhaltlich?

    So wie ich Bernd (der sich momentan wohl noch im Land der Träume befindet ^^) verstanden habe, geht es ihm um zeichenweise Gleichheit.

    Mir persönlich gefällt Deine Lösung bzgl. inhaltlicher Gleichheit aber auch sehr gut, da sie flexibler ist.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • .

    Hinweis: Wer diesen Beitrag noch nicht gelesen hat: Im nächsten Beitrag ist eine kürzere Beschreibung. ;)

    .

    Die Frage wäre: Sollen die beiden Ini-Dateien direkt zeichenweise gleich sein oder nur inhaltlich?

    Z.B. richtet sich die Reihenfolge der Sections nach der aus der Soll.ini.

    Solange mein Kopf noch halbwegs frisch ist, versuche ich's mal. ... Neue Namen: Soll.ini = Master.ini; Ist.ini = User.ini; Ergebnis.ini = Merged.ini

    Das Maß aller Dinge ist die Master.ini, sie soll fast 1:1 identisch auf die Merged.ini abgebildet werden, lediglich vorhandene Schlüsselwerte aus der User.ini werden übernommen (wenn es diese Schlüssel in der Master.ini gibt).

    Die Master.ini wird mit der User.ini wie oben beschrieben vermischt, das Ergebnis ist die Merged.ini. Danach wird die User.ini mit der Merged.ini verglichen. Sind beide nicht absolut gleich (inkl. Groß- / Kleinschreibung), wird der Inhalt der User.ini durch den Inhalt der Merged.ini ersetzt.

    Im Detail

    Das Konzept zum Vermischen soll so aussehen, dass alle Sektionen und Schlüssel nach dem Vermischen genau so in der Merged.ini stehen, wie sie in der Master.ini sind, ausgenommen die Schlüsselwerte. Die Merged.ini soll nach dem Vermischen so aussehen:

    • Die Merged.ini enthält alle Sektionen, Schlüssel und Kommentare der Master.ini.
    • In der User.ini vorhandene Schlüsselwerte wurden übernommen.
    • Neue Schlüssel und -werte aus der Master.ini wurden übernommen.
    • Elemente (Sektionen, Schlüssel, Kommentare) die in der User.ini fehlen, wurden in der Merged.ini ergänzt.
    • Elemente (Sektionen, Schlüssel, Kommentare) die in der Master.ini fehlen, wurden in der Merged.ini gelöscht.
    • Die Reihenfolge ist die der Master.ini, das heißt, alle Elemente stehen in der Merged.ini an der gleichen Stelle wie in der Master.ini, einschließlich Leerzeichen und Leerzeilen.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    Einmal editiert, zuletzt von Professor Bernd (24. April 2021 um 21:00)