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
  • 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

    über mich...

    ich habe meine Erfahrungen hauptsächlich gesammelt in (grobe Übersicht):

    - RibbonBar Automation
    - MySQL Nutzung
    - GUIs in vielerlei Ausprägung
    - Nutzung von Powershell / Batch in AutoIt
    - Windows Automatisierung

    außerhalb von AutoIt:

    - Sprachen: PS, Batch, php, html(5), javascript, (perl eingeschränkt), vbs
    - Powershell (AD, WPF inkl. Multi-Threading, ...)
    - Deployment-Automatisierung ohne SCCM
    - Office-Nutzung mit COM-Object (AutoIt, PowerShell)
    - ActiveDirectory und alles was damit zusammenhängt
    - Hyper-V Clustering (Converged / Hyper Converged)
    - Serverhardware (Konfiguration, Aufbau, Architektur, Betrieb)

    Lieblingsthema:

    günstige Automatisierung von Vorgängen, für die andere Firmen viel Geld nehmen

    more to come ...

  • 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)