Xan hat sehr cool gepostet Code um JSON-Daten in JMP einzulesen.Xan stellte fest, dass die JSL große JSON-Dateien nur langsam lud; Hier ist ein Blick auf einige Ersatz-JSL, um es schneller zu machen.(JSON eignet sich besser für kleine Objekte, aber wenn Sie 100 KB oder mehr laden müssen, hilft dies.)
Der Originalcode von Xan verfügt über eine Parsing-Routine, um die JSON-Zeichenfolge zeichenweise zu lesen:

Die Variable Pos geht durch die Länge der Zeichenfolge, bis Ende , ein Zeichen nach dem anderen.Die wahre Magie in Xans Code liegt in der Handhabung der Zeichen [, ], {, }.Ich habe gerade die magischen Teile in den Ersatzcode kopiert.Oben sehen Sie die Handhabung für Anführungszeichen, Doppelpunkt, t, f.Diese Zeichen steuern die Verarbeitung nachfolgender Zeichen durch den Parser.
Der Mustervergleicher von JMP ist für diese Aufgabe die bessere Wahl.Die folgende JSL ist ein einzelner Mustervergleich, der die gesamte Zeichenfolge von Anfang bis Ende verarbeitet.Da jeder Chunk abgeglichen wird, wird der Chunk von einem in den Match eingebetteten JSL verarbeitet.
Ausschnitt des Ersatzcodes (nicht kopieren!Besserer Code im Anhang):

Die Ersatz-Parse-Funktion umfasst jetzt nur noch 5 Zeilen, aber der Code der ursprünglichen Parse-Funktion ist jetzt vorhanden PatternParse , was auf den ersten Blick recht kompliziert erscheint.Aber eigentlich ist es ungefähr die gleiche Logik wie im Original (die Magie wird kopiert). fast genau!) PatternParse beginnt mit PatPos (0) und endet mit PatRPos (0), wodurch das Muster gezwungen wird, mit allem übereinzustimmen.Der ursprüngliche Code hatte eine While-Schleife.PatternParse hat PatRepeat stattdessen.PatRepeat wiederholt eine Verkettung ( + ) von drei Operationen: (1) PatPos (kein Argument) zeichnet die aktuelle Zeichenposition auf failpos So kann Parse etwas Nützliches sagen, wenn die JSON-Daten unverständlich sind.(2) PatFence beschleunigt das Match, indem es dem Matcher mitteilt, dass bis zum Zaun alles korrekt ist und nicht noch einmal überprüft werden sollte.(3) In der Liste der Alternativen ( | ) in Klammern passiert der Spaß; Überspringen Sie Leerzeichen, passen Sie einen Namen an, passen Sie einen Doppelpunkt an usw. Mustername Und Musternummer (nicht gezeigt) sind im Anhang und tun, was Sie vermuten.
Das letzte Puzzleteil ist PatTest .PatTest wertet sein Argument als 0 oder 1 aus; wenn 1, dann ist der Test erfolgreich, es werden keine Zeichen gefunden, und die Übereinstimmung wird fortgesetzt.(Wenn es mit einer 0 fehlschlägt, macht der Matcher ein Backup und versucht Alternativen, aber das passiert hier nie: Beachten Sie jeden PatTest endet mit ;1 für den Rückgabewert.) In diesem Programm PatTest wird verwendet, um etwas JSL in die Mitte eines Spiels einzuschleusen, nicht um tatsächlich etwas zu testen.
Mit diesen Änderungen und einer von Xan vorgeschlagenen Änderung Um ein langsames Einfügen am Ende einer Liste durch ein schnelles Einfügen am Anfang einer Liste zu ersetzen, lädt JMP 180 MB JSON-Daten in 90 Sekunden (im Vergleich zu 0,25 MB in 5 Minuten), was einer 1000-fachen Verbesserung entspricht.Vielleicht besser, da es jetzt möglicherweise linear zur Dateigröße ist.

Der beigefügte Code ist nicht gut getestet. Senden Sie eine Nachricht zurück, wenn er für Sie funktioniert. Vielen Dank!
Falls Sie sich hier wiederfinden: Das war, bevor JMP über eine gute integrierte JSON- (und XML-)Analyse verfügte. Dieses Beispiel ist immer noch ein großartiges Beispiel dafür, wie Sie den Mustervergleich von JMP effizient nutzen können.
Der integrierte Assistent für den JSON- und XML-Import wird diesen Code wahrscheinlich übertreffen und Ihnen dabei helfen, eine Datentabelle mit den benötigten Daten zu erstellen.