Hilfe bei Regex

  • Na super,

    bin halt Anfänger hab gedacht das muss alles über ein Browser laufen.

    Vielen Dank für deine Mühe und noch eine schöne Adventszeit.

    Gruß Windi

  • Ich bin absolut kein Json-Mensch aber für mich sieht es aus als ob er die jeweilig übergebenen Strings nicht verarbeiten kann.

    Prüfe doch mal deren Inhalt vor der Übergabe an die Funktion (Ausgabe in eine Datei oder Consolewrite).

  • Was mache ich falsch?

    Wie AspirinJunkie bereits schrieb, benötigst Du den Webdriver überhaupt nicht.

    Poste bitte mal die #Include Anweisungen, die Du verwendest.

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

  • Danke für die Rückmeldung.

    Es ist nur seltsam das der Webdrv mit der einen Json läuft und mit der anderen nicht.

    Und beim Script ist es umgekehrt.

    Deshalb vermute ich es muss an der Json liegen.

  • Für das Script brauch ich den Webdriver nicht.

    Aber wenn die Geokodierung fertig ist muss ich mit dem Webdriver die Datei mit Mydrive an das Navi senden.

    Dazu brauch ich ihn, um die iframes zu steuern.

    Was passiert denn, wenn Du das Skript von AspirinJunkie (Beitrag #20) ohne Änderungen (außer deinem Key) bei Dir laufen lässt ?

    Wie ich geschrieben habe mit der einen Json geht es mit der anderen nicht.

    und einmal kommt Fehlermeldung 1 und bei der anderen kommt beim Webdriver Meldung 2.


    Der Webdriver verwendet eine andere JSON-UDF

    Das habe ich ja festgestellt!

    und deshalb habe ich mich gemeldet.

    Meine Frage?

    Gibt es vielleicht noch eine andere Version der Json für beide.

  • Sorge einfach dafür das in beiden UDF keine doppelten Namen vorkommen und dann kannst du beide verwenden (natürlich musst du dann auch die entsprechenden Aufrufe abändern).

  • Kann man es auch so machen?

    C
    #include <Json_1.au3>
    und
    #include <Json_2.au3>

    Oder geht das nicht. Werde es mal ausprobieren!

    Ich könnte auch am Anfang vom Script immer die entsprechende Datei in den include Ordner kopieren.

  • Der Fehler "unknown function" kommt eigentlich nur wenn die Datei in welcher diese Funktion definiert ist nicht richtig inkludiert wurde.
    Entweder fehlt die #include-Anweisung, oder sie bezeichnet die falsche Datei oder die einzubindende Datei befindet sich in einem anderen Ordner.

    Wenn du die UDF also z.B. in JSON_2.au3 umbenannt hast, aber als include immer noch #include "JSON.au3" dasteht - dann kommt so ein Fehler.

    Das wäre meiner Meinung nach der eigentliche Grund für die Fehler.

    Nun hast du ja aber noch das zweite Phänomen mit den zwei gleichzeitig zu verwendenden UDFs, welche eine Funktion mit gleichem Namen definieren.

    Nun da gibt es eigentlich nur die Lösung, welche Moombas bereits vorschlug:

    Schnapp dir die UDF und änder in der Funktionsdefinition den Namen der Funktion _JSON_Get() (das ist soweit ich es überblicke die einzige die doppelt definiert wird)

    Anschließend verwendest du im Skript diesen neuen von dir gewählten Namen.

    Edit: Sehe gerade, dass die eben nicht doppelt benannt sind. Meine Funktionsnamen haben alle einen Unterstrich am Anfang - die von der anderen UDF nicht.
    Es sollte daher also gar keine Probleme von der Bezeichnung her geben.

    Einmal editiert, zuletzt von AspirinJunkie (6. Dezember 2022 um 13:09)

  • Hab's jetzt so gemacht und es funktioniert.

    Wie gesagt die vom Webdriver mag es nicht.

    der anderen ist es egal.

    C
    #include "JSON.au3"
    #include "JSON_S.au3" ;Für Geokodierung
  • Hab jetzt gesehen, dass die Funktionen doch nicht doppelt bezeichnet sind - meine haben einen Unterstrich - die anderen nicht.
    Es sollte daher eigentlich diesbezüglich keine Probleme geben.

    Die zwei Screenshots bringen uns diesbezüglich auch nicht weiter.
    Ein winziges Minimalskript welches den Fehler reproduziert wäre angebracht.

    Ansonsten zwingt dich keiner meine UDF für die JSON-Weiterverarbeitung zu verwenden.
    Du kannst das Skript von oben doch auch einfach so anpassen, dass die Extraktion der Werte über die andere UDF geschieht:

  • Hi @AspirinJunkie,

    Du bist echt der größte, hab gar nicht gewußt was du damit meinst.

    Es läuft alles perfekt.

    War ja sooo froh das du mir geholfen hast.

    Hab mal wieder gemerkt, dass ich noch sehr viel lernen muss.

    Aber auf Grund meines alters, wird dass in diesem Leben nichts mehr.

    Danke nochmal

    auch an die anderen.

    Gruß Windi

  • Aber auf Grund meines alters, wird dass in diesem Leben nichts mehr.

    Ich sehe das genau anders^^ Je älter ich werde, desto mehr will ich noch (dazu-) lernen...und in einigen Jährchen, wenn ich dann in Rente bin, habe ich auch endlich genug Zeit dafür! :rock:

  • Ich sehe das genau anders^^ Je älter ich werde, desto mehr will ich noch (dazu-) lernen...und in einigen Jährchen, wenn ich dann in Rente bin, habe ich auch endlich genug Zeit dafür! :rock:

    :thumbup:

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

  • Zitat

    Je älter ich werde, desto mehr will ich noch (dazu-) lernen

    Glaube mir ich spreche aus Erfahrung:

    Du musst mindestens 40 % mehr dazu lernen.

    Denn durch das alter vergisst du wieder 60 % und es wird immer mehr. :(:(:(

    Noch mal eine Frage an die Expertenrunde?

    Wie baut man so eine Url zusammen?

    Ich hatte es so gemacht, geht auch, aber elend langsam, im Verhältnis von dem Script von AspirinJunkie


    Code
    Local $Geo =  "50.77677,7.08529:50.72258,7.37596"
    Local $MS = 80
    Global CONST $SAPIKEY_TOMTOM = "..."
    
    Global $url = ("https://api.tomtom.com/routing/1/calculateRoute/" & $Geo & "/json?maxAlternatives=3&language=de-DE&sectionType=traffic&routeType=fastest&traffic=true&avoid=unpavedRoads&travelMode=car&vehicleMaxSpeed=" & $MS & "&key=********")

    Viele Grüße vom alten Mann

    der schon wieder die Hälfte vergessen hat

    Windi

  • Wie baut man so eine Url zusammen?

    Ich hatte es so gemacht, geht auch, aber elend langsam,

    Die URL zusammenbauen bedeutet im Prinzip ja nur verschiedene Teilstrings hintereinander zusammen zu kleben.

    Die Variante wie du es gemacht hast, ist exakt die Syntax die man hierfür in AutoIt verwendet.

    Mir ist nur noch nicht klar was du mit "elend langsam" in diesem Zusammenhang genau meinst.
    Die Ausführungsgeschwindigkeit ist es sehr wahrscheinlich nicht - denn das geht flott.

    Ich vermute du meinst eher die Zeit die du zum Zusammenschreiben der Zeile benötigst - also die ganzen Anführungszeichen und &-Operatoren - oder?

    Nun - ja das kann schon etwas aufwendig werden und zwischendurch auch zu Schreibfehlern führen - insbesondere wenn es sehr viele Bestandteile sind.

    Ich werde dir daher mal ein paar Beispiele geben wie du eventuell den String etwas übersichtlicher zusammenbauen kannst.

    Ausdrücklich möchte ich aber nochmal darauf hinweisen, dass die Variante die du genommen hast absolut korrekt und erstmal die präferierte Variante ist - du kannst es problemlos so weiter handhaben.

    1. Befehlszeilenumbrüche einfügen für mehr Übersicht um nicht ewig lange Zeilen zu erhalten.
    Hierzu verwendet man den _-"Operator" am Ende einer Zeile, der signalisiert, dass der Befehl auf der anderen Zeile weitergeht.
    Auf diese Weise kann man Befehle in AutoIt auf mehrere Zeilen aufteilen:

    2. Option "ExpandVarStrings" setzen.

    Wenn man diese Option setzt, dann kann man Variablen direkt in Strings verwenden indem man den Variablennamen in Dollarzeichen einschließt. (Makros in @-Zeichen).

    Man muss nur bisschen aufpassen wenn man Dollar- oder @-Zeichen im String erhalten möchte - die muss man dann durch Dopplung vor einer Interpretation bewahren:

    AutoIt
    Opt("ExpandVarStrings", 1)
    
    Local $Geo =  "50.77677,7.08529:50.72258,7.37596"
    Local $MS = 80
    Global CONST $SAPIKEY_TOMTOM = "..."
    
    Global $url =     "https://api.tomtom.com/routing/1/calculateRoute/$Geo$/json?maxAlternatives=3&language=de-DE&sectionType=traffic&routeType=fastest&traffic=true&avoid=unpavedRoads&travelMode=car&vehicleMaxSpeed=$MS$&key=$SAPIKEY_TOMTOM$"
    
    ConsoleWrite($url & @CRLF)

    3. StringFormat verwenden.

    StringFormat ist eigentlich nur die Umsetzung der guten alten C-Funktion "printf()" für AutoIt.

    Hier definiert man seinen String und setzt darin Platzhalter, welche man auch noch für verschiedene Datentypen anpassen kann.
    Die Werte die dann für die Platzhalter eingesetzt werden sollen, werden dann einfach in der selben Reihenfolge als folgende Parameter der Funktion eingetragen.
    Im einfachsten Fall wäre der Platzhalter ein %s welches angibt, dass dort ein String eingefügt werden soll.

    AutoIt
    Local $Geo =  "50.77677,7.08529:50.72258,7.37596"
    Local $MS = 80
    Global CONST $SAPIKEY_TOMTOM = "..."
    
    Global $url = StringFormat( _
        "https://api.tomtom.com/routing/1/calculateRoute/%s/json?maxAlternatives=3&language=de-DE&sectionType=traffic&routeType=fastest&traffic=true&avoid=unpavedRoads&travelMode=car&vehicleMaxSpeed=%s&key=%s", _
        $Geo, $MS, $SAPIKEY_TOMTOM)
    
    ConsoleWrite($url & @CRLF)

    4. Für jeweiligen Anwendungsfall Helfer schreiben.

    Da wir es hier mit einer URL und GET-Parametern zu tun haben kann man sich das ganze eventuell übersichtlicher gestalten, wenn man die Parameter einzeln als Liste behandelt und sich die URL dann automatisiert zusammenbauen lässt.
    Die GET-Parameter einer URL sind im Grunde nur Schlüssel-Wert-Paare und damit eignet sich eine AutoIt-Map wunderbar um diese strukturiert zu halten.

    Auf die Art kann man sich eine kleine Helferfunktion schreiben und bekommt so evtl. etwas mehr Übersicht in sein Skript:

  • Glaube mir ich spreche aus Erfahrung:

    Du musst mindestens 40 % mehr dazu lernen.

    Denn durch das alter vergisst du wieder 60 % und es wird immer mehr

    Hmm, kann ich eigentlich nicht bestätigen. Als Post-Sixty habe ich eher den Eindruck, dass das Lernen mit jedem neuen Lebensjahr leichter fällt. Die richtigen Lerntechniken hat man in den vergangenen Jahrzehnten immer weiter verfeinert und da die Basis immer größer wird, sind es immer nur recht wenige wirklich neue Lerninhalte.

    OK, das Erinnerungsvermögen nimmt manchmal unerwartet eine kleine Auszeit - aber nicht wirklich dramatisch. :rofl:

  • Vielen Dank für die ausführliche erläuterung.

    Dachte meine Version wäre eine stümperhafte.

    Bin jetzt aber ganz Stolz. :klatschen:

    Hab Stunden damit verbracht, mit den Befehlszeilenumbrüchen.

    Jetzt weiß ich was ich immer vergessen habe es waren die " am Ende jeder Zeile. ( _ ) das wusste ich! :)

    Zitat


    Ich hatte es so gemacht, geht auch, aber elend langsam,

    Hab es mit Stringsplit auseinander genommen und Zeilenweise in Excel eingefügt.

    Deine Funtionen sind der Hammer (weiß zwar nicht was das ganze Zeug bedeutet).

    Im Array fluschtschen sie in null Komma nix durch.

    Arbeite erst seit 2 Monaten mit Arrays.

    Nochmals Vielen Vielen Dank :klatschen: