Stringmanipulation in einer Funktion

  • Hallo

    Ich habe eine Funktion geschrieben welche mittels FileRead eine Variable mit Text abgefüllt >>> {"version":"0.170.14.7","oldVersion":"0.170.13.804"}

    In einem zweiten Schritt versuche ich nun den Wert welcher zwischen dem 3. und 4. Anführungszeichen steht "0.170.14.7" wiederum in eine Variable zu schreiben, aber hier scheitere ich!

    Mein Versuch mit StringMid funktioniert, aber das Resultat ist nur solange korrekt, wie sich die Versionierung (Anzahl Char) nicht ändert.

    Kann mir jemand Hilfestellung leisten und sagen wie ich das, resp. mit welchem Befehl sowas gemacht werden kann ich lese im Tutorial nach aber verstehe es nicht?

    Gibt es etwas das sich wie awk, sed oder dergl. anfühlt?

    Besten Dank für Unterstützung

    Gruss Thork


    Func _Read_info()

    $ABCinfo = FileRead("C:\Program Files (x86)\ABC\install.json")

                            ;MsgBox (0, "JASON File", "Ergebnis ist: " & $ABCinfo)

                            $ABCinfo2 = StringMid($ABCinfo, 12, 12)

    ;MsgBox(0, "12 chars extracted from position 11 are:", $ABCinfo2)

    EndFunc ;==>_Read__info

  • In einem zweiten Schritt versuche ich nun den Wert welcher zwischen dem 3. und 4. Anführungszeichen steht "0.170.14.7" wiederum in eine Variable zu schreiben, aber hier scheitere ich!

    Mein Versuch mit StringMid funktioniert, aber das Resultat ist nur solange korrekt, wie sich die Versionierung (Anzahl Char) nicht ändert.

    Falls Du bei Stringfunktionen bleiben möchtest, dann wäre dies ein Weg :

    (könnte man auch kürzer schreiben, aber so ist es übersichtlicher)

    AutoIt
    Global $sMainString = '{"version":"0.170.14.7","oldVersion":"0.170.13.804"}'
    Global $sSubString, $iStartPos, $iEndPos
    $iStartPos  = StringInStr($sMainString, '"', default, 3)
    $iEndPos    = StringInStr($sMainString, '"', default, 4)
    $sSubString = StringMid($sMainString, $iStartPos + 1, ($iEndPos -1) - $iStartPos)
    MsgBox(0, "", $sSubString & @CRLF)

    Eine Alternative wäre StringRegExp , aber das ist nicht jedermanns Sache ;) :

    AutoIt
    Global $aMatch = StringRegExp('{"version":"0.170.14.7","oldVersion":"0.170.13.804"}', '(?m)^(?:.*?\"){3}([^\"]+)', 3)
    If Not @error Then MsgBox(0, "", $aMatch[0] & @CRLF)

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

    3 Mal editiert, zuletzt von Musashi (27. November 2020 um 01:46) aus folgendem Grund: typo, RegEx hinzugefügt

  • Eine Alternative wäre StringRegExp

    oder StringRegExpReplace...

    AutoIt
    Global $sMatch = StringRegExpReplace('{"version":"0.170.14.7","oldVersion":"0.170.13.804"}', '.*:"(.+)",.*', '\1')
    ConsoleWrite($sMatch & @CRLF)

    (?m) mach doch nur Sinn, wenn der Text Zeilenumbrüche enthält, oder? 8o

    AutoIt
    Global $aMatch = StringRegExp('{"version":"0.170.14.7","oldVersion":"0.170.13.804"}', '.*:"(.+)",.*', 3)
    If Not @error Then MsgBox(0, "", $aMatch[0] & @CRLF)

    2 Mal editiert, zuletzt von Bitnugger (27. November 2020 um 06:10)

  • Morgen allerseits,

    Besten Dank fuer die Tipps, muss erst mal verstehen was eure Vorschläge machen.

    Eine Frage hätte ich schon, ich lese ja den string in eine Variable ($ABCinfo) ein, in euren Beispielen deklariert ihr den Wert aber statisch (der String im json File kann dauernd ändern, nur das Format bleibt beständig).

    Wie auch immer, muss mich mit trial und error herantasten.

    Gruss thork

    • Offizieller Beitrag

    Eine Frage hätte ich schon, ich lese ja den string in eine Variable ($ABCinfo) ein, in euren Beispielen deklariert ihr den Wert aber statisch (der String im json File kann dauernd ändern, nur das Format bleibt beständig).

    Der String darf auch eine Variable sein:

    AutoIt
    Global $ABCinfo = '{"version":"0.170.14.7","oldVersion":"0.170.13.804"}'
    
    Global $aMatch = StringRegExp($ABCinfo, '.*:"(.+)",.*', 3)
    If Not @error Then MsgBox(0, "", $aMatch[0] & @CRLF)
  • Da es sich um eine json-Datei handelt ist es naheliegend wenn man einen entsprechenden JSON-Parser verwendet.

    Dann ist die Abfrage simpel und vor allem stabil denn die Definition "zwischen 3. und 4. Anführungszeichen" passt vielleicht auf den aktuellen Zustand aber wenn zusätzliche Infos mal reinkommen oder die Reihenfolge der Values wechselt dann crasht das ganze.

    Mit der UDF von hier siehts so aus:

    Edit:

    Ich habe eine Funktion geschrieben welche mittels FileRead eine Variable mit Text abgefüllt

    Wenn damit gemeint ist, dass der genannte Abschnitt vorher aus einer größeren JSON-Datei rausgeholt wird, dann kannst du dir den Schritt bei Verwendung eines JSON-Parsers direkt sparen, da du direkt den gewünschten Wert aus dem Gesamtkonstrukt holen kannst ohne erst vorher einen bestimmten Teilbereich herauszuschälen. Bei Bedarf poste einfach mal die ganze Datei.

    2 Mal editiert, zuletzt von AspirinJunkie (27. November 2020 um 09:46)

  • Da es sich um eine json-Datei handelt ist es naheliegend wenn man einen entsprechenden JSON-Parser verwendet.

    ... die Definition "zwischen 3. und 4. Anführungszeichen" passt vielleicht auf den aktuellen Zustand aber wenn zusätzliche Infos mal reinkommen ...

    Wo Du recht hast, hast Du recht :!:.

    Thorkfumble :

    Die Lösung von AspirinJunkie ist, meiner Meinung nach, für Dein Problem am besten geeignet.

    Dann musst Du Dich auch nicht mit 'Regulären Ausdrücken' herumquälen (außer natürlich, Du möchtest das ^^).

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

  • Hallo

    Ganz herzlichen Dank für die tolle Unterstützung und Ratschläge von euch allen!

    In der Zwischenzeit habe ich "meinen" Skript fertig und es funzt (hat aber bestimmt noch Luft nach oben was die Qualität anbelangt)!

    Gruss Thork