Problem Datenbank und JSON

  • Hallo @asprinjunkie,

    danke für deine tolle Arbeit.

    Solche UDF´s sind GOLD wert. :rock:

    EIne Frage habe ich dazu.

    Ich bekomme via UDP ein JSON Protokoll geliefert, fomatiere das und speichere es gleich als komplettes Paket in die SQL DB.

    Dabei ist mir der TimeStamp aufgefallen. Der wird anscheinend nicht richtig konvertiert...


    so sieht er in der SQL DB aus "positionTS": 1.50809e+12

    So sollte er aussehen: "positionTS": 1430140978241,

    Mach ich mit der JSON UDF was falsch?

    VG

    horphi

  • Dabei ist mir der TimeStamp aufgefallen. Der wird anscheinend nicht richtig konvertiert...


    so sieht er in der SQL DB aus "positionTS": 1.50809e+12

    So sollte er aussehen: "positionTS": 1430140978241,

    Ich verstehe ehrlich gesagt noch nicht um was es geht.

    Wie sehen die Eingabedaten aus, was stellen diese dar und wie sollen diese schlussendlich aussehen?

    Zeig mal bitte ein paar Beispieldaten.

  • Ich verstehe ehrlich gesagt noch nicht um was es geht.

    Wie sehen die Eingabedaten aus, was stellen diese dar und wie sollen diese schlussendlich aussehen?

    Es handelt sich vermutlich um einen Zeitstempel (positionTS). Nun stellt sich hier die Frage ob AutoIt oder das DBS den Integer falsch interpretiert.

    AutoIt selbst hat den Hang dazu, große Zahlen nicht mehr vollständig darzustellen sondern beispielsweise als 4.2321e+123.

    Allerdings sollte das bei 1430140978241 noch nicht passieren.

  • Schon klar das es ein Timestamp ist.

    Die Frage ist nur was das mit der JSON-UDF zu tun hat.

    Anhand der Infos ist mir nicht klar was als Eingabedaten rein kommt, was raus kommt und wie es stattdessen aussehen soll.

    Edit horphi: habe mal versucht nachzuvollziehen was gemeint ist und bin dabei auf eine Rundungsproblematik durch StringFormat gestoßen.

    Hierbei wird aus 1430140978241 eine 1.43014e+12 gemacht.

    Habe daher nun die JSON_Generate-Funktion entsprechend angepasst.

    Um zu ergründen was es mit der von Dir erwähnten 1.50809e+12 auf sich hat benötige ich mehr Input.

    Einmal editiert, zuletzt von AspirinJunkie (16. Oktober 2017 um 12:08)

  • Hallo AspirinJunkie,

    vielen Dank für deine Anpassung. Klappt super. :)

    der 2. erwähnte Wert war ein Fehler von mir.

    Ich habe 2 Werte genannt Input und Output. Beide waren von unterschiedlichen Zeitpunkten. Es sind nicht die selben Werte.

    Mit der Anpassung klappt es sehr gut .

    Das kommt in meiner DB jetzt an.

    Eine generelle Frage hätte ich noch.

    Wieviel Pakete dieser Art kann ich in einer Sekunde verarbeiten?

    HIntergrund: ich bekomme via UDP Datenpakete aus dem Netz und speichere diese in meiner DB.

    Stichwort IoT : es sind Bewegunsdaten von Sensoren.

    Dazu möchte ich gerne verstehen, wieviele Pakete pro Sekunde maximal ,ohne verluste, empfangen, aus Json umwandeln und in meiner MariaDB speichern kann, während mein UDPRecv den Port abhört.

    Vielen Dank und Gruß,

    horphi

  • Kurz: Das hängt von so vielen Faktoren ab (Leistung deines Rechners, Netzwerkperformance, Konfiguration der Komponenten, etc....) dass ich keine Antwort darauf geben kann.

    Nimm TimerInit()/TimerDiff() und miss einfach.

    Da du eigentlich nur einen Teil aus dem JSON-String herausschneiden möchtest ist es eigentlich etwas overdosed den ganzen String zu parsen und dann nur den benötigten Teil wieder in ein JSON-String zu serialisieren.

    Wenn du mal ein Beispiel-Paket zeigst könnte man das sicherlich ziemlich fix per RegEx abhandeln.

    Einmal editiert, zuletzt von AspirinJunkie (16. Oktober 2017 um 21:56)

  • Hallo AspirinJunkie,

    danke für dein Feedback.

    Das Paket habe ich in meinem vorherigen Post eingefügt.

    SO kommen die Pakete aus dem Netzwerk.

    Meinst du, ich sollte das Paket einfach per Regex lesen, die ID herausfiltern und den Rest roh in die DB einfügen?

    VG

    horphi

  • Meinst du, ich sollte das Paket einfach per Regex lesen, die ID herausfiltern und den Rest roh in die DB einfügen?

    Ja na klar. Alles was du machst ist aus einem JSON-String Ein AutoIt-Objekt zu machen, die ID raus zu filtern und anschließend daraus wieder einen JSON-String zu machen.

    Die ID lässt sich fix z.B. so ermitteln: $s_Type = StringRegExp($sReceived, '"id"\s*:\s*"(.*?)(?<!\\)(?>\\\\)*"', 1)[0]. Der Datenbank kannst du dann weiterhin den Ausgangsstring hinzufügen und sparst dir das ganze parsen und konvertieren.

    2 Mal editiert, zuletzt von AspirinJunkie (18. Oktober 2017 um 09:41)

    • Offizieller Beitrag

    Bei Regex führen viele Wege zum Ziel. Ich arbeite gern mit Negation, weil das das Pattern meist deutlich kürzt (und somit lesbarer macht).

    $s_Type = StringRegExp($sReceived,'"id"\s*:\s*"([^"]+)', 1)[0]


    EDIT:

    Die Fragestellung hat ja nur am Rande mit der UDF zu tun und gehört m.M. nach in H&U.

    Ich trenne daher den Bereich ab und verschiebe dorthin.

  • Bei Regex führen viele Wege zum Ziel. Ich arbeite gern mit Negation, weil das das Pattern meist deutlich kürzt (und somit lesbarer macht).

    $s_Type = StringRegExp($sReceived,'"id"\s*:\s*"([^"]+)', 1)[0]

    Wenn man vorher weiß dass der Suchstring immer so aussieht und keine Escapes enthält dann ist das tatsächlich die nachvollziehbarere, einfachere und wahrscheinlich auch performantere Variante.

    Wenn man allerdings - wie ich - von einem allgemeinen regelkonformen JSON-String ausgeht dann muss man auch daran denken dass Anführungszeichen escaped werden können (\").

    Und ja - der Fall dass man in einem String 3 Backslashes und danach ein escapetes Anführungszeichen (\\\\\\\") findet ist durchaus unwahrscheinlich.

    Will man jedoch JSON-konform arbeiten muss man in seinem Pattern auch diese Fälle mit abfangen.

    Dann kommt dann soetwas heraus wie bei mir.

    Unsere Pattern unterscheiden sich also nicht lediglich in der Ausführung sondern bereits im damit verfolgten Ziel.

    P.S.: Danke für's Abtrennen!