Xan hat sehr cool gepostet Code um JSON-Daten in JMP einzulesen.Xan bemerkte, dass die JSL große JSON-Dateien 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 ursprüngliche Code 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, um Ende , ein Zeichen nach dem anderen.Die wahre Magie in Xans Code liegt in der Handhabung der Zeichen [, ], {, }.Ich habe einfach die magischen Teile in den Ersatzcode kopiert.Oben sehen Sie die Behandlung von Anführungszeichen, Doppelpunkt, t, f.Diese Zeichen steuern die Verarbeitung nachfolgender Zeichen durch den Parser.
Der Pattern Matcher von JMP ist für diesen Job die bessere Wahl.Die folgende JSL ist ein einzelner Musterabgleich, der die gesamte Zeichenfolge von Anfang bis Ende verarbeitet.Wenn jeder Chunk abgeglichen wird, verarbeitet eine in die Übereinstimmung eingebettete JSL den Chunk.
Ausschnitt des Ersatzcodes (nicht kopieren!Besserer Code im Anhang):

Die Ersatz-Parse-Funktion ist jetzt nur noch 5 Zeilen lang, aber der Code der ursprünglichen Parse-Funktion ist jetzt drin PatternParse , was auf den ersten Blick ziemlich kompliziert erscheint.Aber eigentlich ist es ungefähr die gleiche Logik wie im Original (die Magie wird kopiert fast exakt!) PatternParse beginnt mit PatPos (0) und endet mit PatRPos (0), die das Muster dazu zwingen, 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 Fehler Parse kann also etwas Nützliches sagen, wenn die JSON-Daten unverständlich sind.(2) PatFence beschleunigt das Match, indem es dem Matcher sagt, dass alles bis zum Zaun korrekt ist und nicht erneut besucht werden sollte.(3) Die eingeklammerte Liste der Alternativen ( | ) ist der Ort, an dem der Spaß passiert; überspringen Sie Leerzeichen, passen Sie einen Namen an, passen Sie einen Doppelpunkt an usw. Mustername und Musternummer (nicht gezeigt) befinden sich im Anhang und tun, was Sie vermuten würden.
Das letzte Puzzleteil ist PatTest .PatTest wertet sein Argument zu 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, dann macht der Matcher einen Schritt zurück und versucht Alternativen, aber das passiert hier nie: Beachten Sie jeder PatTest endet mit ;1 für den Rückgabewert.) In diesem Programm PatTest wird verwendet, um etwas JSL in die Mitte eines Spiels zu injizieren, nicht um tatsächlich etwas zu testen.
Mit diesen Änderungen und einer Änderung schlug Xan vor 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 (gegenüber 0,25 MB in 5 Minuten), eine 1000-fache Verbesserung.Vielleicht besser, da es jetzt mit der Dateigröße linear sein könnte.

Der angehängte Code ist nicht gut getestet, posten Sie eine Notiz zurück, wenn es für Sie funktioniert, danke!
Wenn Sie sich hier wiederfinden: Dies 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 Musterabgleich von JMP effizient nutzen können.
Der integrierte Assistent für den JSON- und XML-Import wird diesen Code wahrscheinlich übertreffen und Ihnen helfen, eine Datentabelle mit den benötigten Daten zu erstellen.