Speichern eines neuen Skripts, um Variablen für später aufzubewahrenHallo,
Ich habe ein Skript erstellt, das eine Datenanalyse durchführt, für dessen Konfiguration jedoch verschiedene Benutzereingaben erforderlich sind. Es gibt Fälle, in denen ich später eine ähnliche Analyse durchführen möchte, aber nicht alle meine Einstellungen erneut eingeben muss. Das Hauptskript kann bereits vorhandene Variablen lesen und diese Felder automatisch ausfüllen. Wenn ich also eine Möglichkeit habe, diese Standardwerte zu speichern und zu importieren, werde ich eingestellt. Ich möchte mehrere unterschiedliche Konfigurationen haben und nicht das Skript selbst bearbeiten müssen, um ein neues zu erstellen.
Eine Idee bestand darin, eine Tabelle mit einer Spalte mit Variablennamen und einer Spalte mit ihren Werten zu speichern, aber das funktionierte nicht gut mit verschiedenen Variablentypen (Zahlen, Zeichenfolgen, Listen).
Eine besser erscheinende Idee besteht darin, andere .jsl-Dateien, die die Standardeinstellungen für verschiedene Anwendungsfälle enthalten, in einem gemeinsam genutzten Namespace zu speichern und dann den entsprechenden Namensraum auszuführen, bevor ich mein Hauptskript ausführe. Ich möchte die Konfigurationsdatei gerne aus meinem Skript heraus erstellen, anstatt sie manuell zu erstellen.
Ich habe diesen anderen Beitrag zum Speichern neuer JSL-Dateien gefunden. https://community.jmp.com/t5/Discussions/how-do-you-create-a-new-script-file-from-jsl/td-p/34740
Es scheint, als ob ich in der Lage sein sollte, ein JSL-Anführungszeichen einzurichten und dann die aktuellen Werte von Variablen in dieses Anführungszeichen einzufügen, aber NameExpr funktioniert dafür nicht. Zeichenfolgen werden ohne Anführungszeichen ersetzt, Listen erscheinen einfach als Liste und Zahlen werden ignoriert. Gibt es eine kleine Änderung, die dafür sorgen würde, dass dies funktioniert, oder eine bessere Möglichkeit, dasselbe Ziel zu erreichen?
Danke!
names default to here (1);
//namespace for the shared variables
If( !Namespace Exists( "TestNS" ), New Namespace( "TestNS" ) );
//the variables I want to save for later
TestNS:a = 5;
TestNS:b = "text";
TestNS:c = {1,2,3,4};
TestNS:d = {"a","b","c","d"};
//set up script to save as JSL
script = JSL Quote(
TestNS:a = a_dv;
TestNS:b = b_dv;
TestNS:c = c_dv;
TestNS:d = d_dv;
);
//substitute the dummy values for the current values... this isn't working
substitute Into (script, expr(a_dv), nameexpr (TestNS:a));
substitute Into (script, expr(b_dv), nameexpr (TestNS:b));
substitute Into (script, expr(c_dv), nameexpr (TestNS:c));
substitute Into (script, expr(d_dv), nameexpr (TestNS:d));
show(script);
//save script for later use
Save Text File( "$downloads\MyScript.jsl", script );Automatisierung und SkripterstellungWindowsBetreff: Speichern eines neuen Skripts, um Variablen für später aufzubewahrenIch bin mir nicht sicher, wie universell das ist, aber es funktioniert mit Ihrem einfachen Skript
names default to here (1);
//namespace for the shared variables
If( !Namespace Exists( "TestNS" ), New Namespace( "TestNS" ) );
//the variables I want to save for later
TestNS:a = 5;
TestNS:b = "text";
TestNS:c = {1,2,3,4};
TestNS:d = {"a","b","c","d"};
//set up script to save as JSL
script = expr(
TestNS:a = a_dv;
TestNS:b = b_dv;
TestNS:c = c_dv;
TestNS:d = d_dv;
);
//substitute the dummy values for the current values... this isn't working
substitute Into (script, expr(a_dv), nameexpr (TestNS:a));
substitute Into (script, expr(b_dv), nameexpr (TestNS:b));
substitute Into (script, expr(c_dv), nameexpr (TestNS:c));
substitute Into (script, expr(d_dv), nameexpr (TestNS:d));
// Move the arguments in the script to a character string
theScript = "";
i=1;
While( char(arg(script,i)) !="Empty()",
theScript = theScript || char(arg(script,i)) || ";";
i++;
);
show(script);
//save script for later use
Save Text File( "$downloads\MyScript.jsl", theScript );Betreff: Speichern eines neuen Skripts, um Variablen für später aufzubewahrenHaben Sie vielleicht darüber nachgedacht, diese Werte in einem assoziativen Array zu speichern? Es ist höchstwahrscheinlich einfacher zu verwalten und kann bei Bedarf beispielsweise als JSON gespeichert werden.
Names Default To Here(1);
//namespace for the shared variables
If(!Namespace Exists("TestNS"),
New Namespace(
"TestNS"
)
);
//the variables I want to save for later
TestNS:settings = Associative Array();
TestNS:settings["a"] = 5;
TestNS:settings["b"] = "text";
TestNS:settings["c"] = [1 2 3 4];
TestNS:settings["d"] = {"a", "b", "c", "d"};
TestNS:settings["e"] = ["key" => 1];
/*
TestNS:settings["a"] = cur_settings["a"];
TestNS:settings["b"] = cur_settings["b"];
TestNS:settings["c"] = cur_settings["c"];
TestNS:settings["d"] = cur_settings["d"];
TestNS:settings["e"] = cur_settings["e"];
*/
myfilepath = Save Text File("$DOWNLOADS/myscript.jsl", As JSON Expr(TestNS:settings));
conf = Load Text File(myfilepath);
loaded_settings = Parse JSON(conf);
Anschließend können Sie bei Bedarf einige Funktionen wie save_settings, load_settings usw. erstellen.
Betreff: Speichern eines neuen Skripts, um Variablen für später aufzubewahrenDank Jarmo und Jim funktionieren beide Lösungen. Ich habe zunächst Jims Lösung verwendet, die sich direkt an das anschließen ließ, was ich ursprünglich hatte. Nach einiger Überarbeitung habe ich Jarmos Idee angepasst, was tatsächlich übersichtlicher zu handhaben war. Hier ist, was ich letztendlich herausgefunden habe. Bei diesem Setup brauchte ich den Namespace nicht, es würde aber trotzdem mit Namespaces funktionieren.
names default to here (1);
//initialize variables
var1 = {"a", "b", "c"};
var2 = 100;
var3 = [1, 2, 3, 4];
//initialize variables used for functions
VarsToExport = {"var1", "var2", "var3"};
SettingsAA = Associative Array();
loaded_settingsAA = .;
SelfPath = Get Default Directory();
//expr to get each variable in the VarsToExport list and input the value into an AA, export as JSON
ExportVarsExpr = expr(
for each({varname}, VarsToExport,
//show(varname);
SettingsAA[varname] = eval(as name(varname));
//show(SettingsAA);
);
VarsSavePath = Pick File(
"Save a file containing current script settings",
SelfPath,
{"JMP Script Files|jsl", "All Files|*"},
1,
1,
"Layer_Settings.jsl"
);
Save Text File(VarsSavePath, As JSON Expr(settingsAA));
);
//expr open a jsl file, parse JSON into an AA and extract saved values
ImportVarsExpr = expr(
VarsImportPath = Pick File(
"Select jsl file that contains the saved parameters",
SelfPath,
{"JMP Script Files|jsl", "All Files|*"},
1,
0,
""
);
loaded_settingsAA = Parse JSON(Load Text File(VarsImportPath));
//for each element of AA, get the name of the element and set a variable with that name to the AA value
for each({varname}, loaded_settingsAA,
eval(parse(Evalinsert("\[ "^varname^"n = loaded_settingsAA << get value (varname) ]\")));
//show(varname);
//show(loaded_settingsAA << get value (varname));
);
);
//show original variables
Write("\!N", "Original:");
show(var1, var2, var2);
//export variables
eval(ExportVarsExpr);
//clear the variables
var1 = .;
var2 = .;
var3 = .;
Write("\!N", "\!N", "Variables cleared:");
show(var1, var2, var2);
//import variables
eval(ImportVarsExpr);
//show that the variables have been imported
Write("\!N", "\!N", "Post loading:");
show(var1, var2, var2);