Inidatei durchsuchen nach Wert

  • Hallo Gemeinde,

    ist es möglich eine standardkonforme ini-Datei nach einem Wert zu durchsuchen? Beispiel:

    Die ini_Datei beinhaltet folgendes:

    [param1]
    Name=Hans Wurscht
    Persnr=0xCD3BAFB9EE1BB0931EF6FA

    param[2]
    Name=Heinz Hosenfratz
    Persnr=0xC39C07ECD016536F9C49E1
    .

    .

    .

    Ich möchte herausfinden ob eine bestimmte PersNr(die sind verschlüsselt!) in der ini-Datei steht und wenn ja in welcher Section?
    Mit den IniRead Funktionen geht das auf den ersten Blick nicht oder?
    Vielleicht mit FilereadtoArray?

  • Hi hipfzwirgel ,

    ja bspw. mit folgenden Ansatz:

    • IniReadSectionNames()
    • über die gefundenen Werte des Arrays iterieren (For..)
      • jede Section auf die PersNr. prüfen (IniRead())
      • bei Treffer hast du den Sectionsnamen in deiner $i der For-Schleife

    Fertig 😀 .
    Also in aller Kürze. Hoffe du hast damit einen Ansatz.

    Viele Grüße
    Sven

  • Hier mal ein Beispiel (wie von SOLVE-SMART beschrieben)

    Ini-Datei (als Beispiel) :

    Code
    [param1]
    Name=Hans Wurscht
    Persnr=0xCD3BAFB9EE1BB0931EF6FA
    [param2]
    Name=Heinz Hosenfratz
    Persnr=0xC39C07ECD016536F9C49E1
    [param3]
    Name=Max Mustermann
    Persnr=0xAAAC07ECD016536F9C49E1

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

  • Ich will mal noch einen Einzeiler in den Raum werfen... :whistling:

    AutoIt
    $sektion = StringRegExp(FileRead($pathINI), '(?m)\[([^\]]+)\]\r\n[^\r\n]+\r\nPersnr=' & $sPersNr, 1)[0]
    ConsoleWrite('+> Sektion: ' & $sektion & @CRLF)

    Wobei hier zwingend ist, dass der Key "Persnr" der zweite Schlüssel unter dem Sektionsnamen ist. Anderenfalls muss für jede weiter Zeile vor "Persnr" eingefügt werden: [^\r\n]+\r\n

  • Ein 💙 für RegEx BugFix 😅 . Find' ich gut, wenn auch wie von dir beschrieben "nicht ganz" robust.
    Freut mich auch für dich hipfzwirgel , dass es funktioniert und meine Beschreibung hilfreich genug war.

    Musashi : Genau so hätte ich es auch implementiert, also fast genau so 😅 .

    Schönen Abend euch noch. Man liest sich ggf. in der Shoutbox.

    Viele Grüße
    Sven

  • mich hat der RegEx nicht in Ruhe gelassen.

    Daher habe ich mir das jetzt 2 Std. angesehen. Da wird man ja blöde... ^^
    Da der RegEx von BugFix bei mir nicht funktionierte und ich diese Begrenzung auf "2. Parameter" nicht akzeptieren wollte hier meine finale Lösung.

    AutoIt
    $sektion = StringRegExp(FileRead($pathINI), '(?s)\N*.*(\[(.*)\]\N*.*'&$sPersNr&')', 1)
    ConsoleWrite($sektion[1] & @CRLF)

    Wenn die $persnr gefunden wurde, wird "im Prinzip" rückwärts der Suchstring erweitert bis zum nächsten "[*]". Dieses wird als Gruppe "Param1" ausgegeben

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ausführbares Script ("as is"), dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Man möge mir verzeihen, wenn ich nicht perfekten und ideal lesbaren Code zur Verfügung stelle.
    Ich möchte Hilfe zur Selbsthilfe leisten und denke dass eine gewisse Transferleistung erwartet werden kann.

  • Mal noch ein anderes Pattern, welches vor allem bei großen Ini-Dateien besser performen sollte:

    AutoIt
    $pathINI = @ScriptDir & "\Test.ini"
    $sPersNr = '0xC39C07ECD016536F9C49E1'
    
    $aRegEx = StringRegExp(FileRead($pathINI), '(?m)^\[([^\]]+)\][^\[]+' & $sPersNr, 1)
    ConsoleWriteError((@error ? "Person nicht gefunden" : $aRegEx[0]) & @CRLF)

    Ansonsten halte ich hier die Variante mit den Ini-Funktionen für die beste. (es gäbe nämlich noch einen Sonderfall für mein Pattern wo dieses Probleme bekommen würde)