JMP-Tabelle als JSON exportierenErweitern Sie die hervorragende Antwort von @Craige_Hales in JSON <=> JMP. Gibt es eine Möglichkeit, eine JMP-Tabelle in eine JSON-Datei zu konvertieren, wobei die Zeilenreihenfolge der Originaltabelle (zur besseren Lesbarkeit) erhalten bleibt? Verwenden Sie JMP 17.2.0.
InhaltsorganisationDatenzusammenführung und -bereinigungErgebnisse teilen und kommunizierenBetreff: JMP-Tabelle als JSON exportierenIn welches Format soll diese JMP-Tabelle geändert werden?

New Table("Untitled",
Add Rows(5),
Compress File When Saved(1),
New Column("name",
Character,
"Nominal",
Set Values({"KATIE", "LOUISE", "JANE", "JACLYN", "LILLIE"})
),
New Column("age",
Numeric,
"Ordinal",
Format("Fixed Dec", 5, 0),
Set Values([12, 12, 12, 12, 12])
),
New Column("sex",
Character(1),
"Nominal",
Set Values({"F", "F", "F", "F", "F"})
),
New Column("height",
Numeric,
"Continuous",
Format("Fixed Dec", 5, 0),
Set Values([59, 61, 55, 66, 52])
),
New Column("weight",
Numeric,
"Continuous",
Format("Fixed Dec", 5, 0),
Set Values([95, 123, 74, 145, 64])
)
)

[
{
"name" : "KATIE",
"age" : 12,
"sex" : "F",
"height" : 59,
"weight" : 95
},
{
"name" : "LOUISE",
"age" : 12,
"sex" : "F",
"height" : 61,
"weight" : 123
},
{
"name" : "JANE",
"age" : 12,
"sex" : "F",
"height" : 55,
"weight" : 74
},
{
"name" : "JACLYN",
"age" : 12,
"sex" : "F",
"height" : 66,
"weight" : 145
},
{
"name" : "LILLIE",
"age" : 12,
"sex" : "F",
"height" : 52,
"weight" : 64
}
]
Bleibt die Zeilenreihenfolge nicht basierend auf der Reihenfolge der Elemente in der Liste erhalten?
Betreff: JMP-Tabelle als JSON exportierenHallo @jthi ,
Danke für die Antwort. Ich hätte mehr Details angeben sollen. Die Schlüsselreihenfolge bleibt in assoziativen Arrays nicht erhalten. Beispielsweise bleibt die Geschlechterreihenfolge im folgenden Skript nicht erhalten.
Ich nehme an, dass dieses Ergebnis eine völlig neue Lösung erfordert. Ich bin gespannt, ob jemand in der Lage ist, sie herauszufinden.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << Sort( Replace Table, By( :sex ), Order( Descending ) );
result = [=> ];
For( i = 1, i <= N Rows( dt ), i += 1,
If( !Contains( result, dt:sex[i] ),
result[dt:sex[i]] = [=> ]
);
If( !Contains( result[dt:sex[i]], dt:age[i] ),
result[dt:sex[i]][dt:age[i]] = [=> ]
);
If( !Contains( result[dt:sex[i]][dt:age[i]], dt:name[i] ),
result[dt:sex[i]][dt:age[i]][dt:name[i]] = [=> ]
);
result[dt:sex[i]][dt:age[i]][dt:name[i]]["height"] = dt:height[i];
result[dt:sex[i]][dt:age[i]][dt:name[i]]["weight"] = dt:weight[i];
);
Write( As JSON Expr( result ) );
Betreff: JMP-Tabelle als JSON exportierenIch bin mir immer noch nicht sicher, welches Format Sie suchen. Ich kann sehen, was das Skript erstellt (wenn ich mich richtig erinnere, ist das kein gültiges JSON, da die Schlüssel keine Zeichenfolgen sind), aber Sie möchten sie grundsätzlich basierend auf etwas gruppieren (in diesem Fall Geschlecht -> Alter -> Name, was Schlüssel sind, und dann hat Name einen Wert mit mehr Schlüsseln). Was versuchen Sie letztendlich zu tun?
Betreff: JMP-Tabelle als JSON exportierenDie Ausgabe sollte wie unten aussehen, außer dass die Reihenfolge von „F“ und „M“ umgekehrt sein sollte.
{
"F": {
12: {
"JACLYN": {
"height": 66,
"weight": 145
},
"JANE": {
"height": 55,
"weight": 74
},
"KATIE": {
"height": 59,
"weight": 95
},
"LILLIE": {
"height": 52,
"weight": 64
},
"LOUISE": {
"height": 61,
"weight": 123
}
},
13: {
"ALICE": {
"height": 61,
"weight": 107
},
"BARBARA": {
"height": 60,
"weight": 112
},
"SUSAN": {
"height": 56,
"weight": 67
}
},
14: {
"CAROL": {
"height": 63,
"weight": 84
},
"ELIZABETH": {
"height": 62,
"weight": 91
},
"JUDY": {
"height": 61,
"weight": 81
},
"LESLIE": {
"height": 65,
"weight": 142
},
"PATTY": {
"height": 62,
"weight": 85
}
},
15: {
"AMY": {
"height": 64,
"weight": 112
},
"MARY": {
"height": 62,
"weight": 92
}
},
16: {
"MARION": {
"height": 60,
"weight": 115
},
"MARTHA": {
"height": 65,
"weight": 112
}
},
17: {
"LINDA": {
"height": 62,
"weight": 116
}
}
},
"M": {
12: {
"JAMES": {
"height": 61,
"weight": 128
},
"ROBERT": {
"height": 51,
"weight": 79
},
"TIM": {
"height": 60,
"weight": 84
}
},
13: {
"DAVID": {
"height": 59,
"weight": 79
},
"JOE": {
"height": 63,
"weight": 105
},
"JOHN": {
"height": 65,
"weight": 98
},
"MICHAEL": {
"height": 58,
"weight": 95
}
},
14: {
"ALFRED": {
"height": 64,
"weight": 99
},
"CHRIS": {
"height": 64,
"weight": 99
},
"EDWARD": {
"height": 68,
"weight": 112
},
"FREDERICK": {
"height": 63,
"weight": 93
},
"HENRY": {
"height": 65,
"weight": 119
},
"JEFFREY": {
"height": 69,
"weight": 113
},
"LEWIS": {
"height": 64,
"weight": 92
}
},
15: {
"CLAY": {
"height": 66,
"weight": 105
},
"DANNY": {
"height": 66,
"weight": 106
},
"MARK": {
"height": 62,
"weight": 104
},
"ROBERT": {
"height": 67,
"weight": 128
},
"WILLIAM": {
"height": 65,
"weight": 111
}
},
16: {
"PHILLIP": {
"height": 68,
"weight": 128
}
},
17: {
"KIRK": {
"height": 68,
"weight": 134
},
"LAWRENCE": {
"height": 70,
"weight": 172
}
}
}
}Betreff: JMP-Tabelle als JSON exportierenIn Ihrem Beispiel haben sich auch die Namen in ihrer Reihenfolge geändert. Muss nur die äußerste Schicht eine bestimmte Reihenfolge einhalten?
Ich denke, keine der vorhandenen Methoden zum direkten Erstellen von JSON aus JMP unterstützt ein solches Format und da JMP nichts wie OrderedDict aus Python hat, werden die Schlüssel immer sortiert. Wenn Sie JMP18 haben, könnten Sie vielleicht die Python-Integration nutzen. Rein in JMP/JSL wären Sie meiner Meinung nach auf einige Teile der Zeichenfolgenerstellung angewiesen. Eine andere Option in JSL besteht darin, dass Sie Ihren Daten höchstwahrscheinlich zusätzliche Informationen hinzufügen könnten, um die Reihenfolge zu erzwingen, ein assoziatives Array zu erstellen, daraus eine JSON-Zeichenfolge zu erstellen (noch nicht speichern) und dann Substitute verwenden könnten, um diese Werte wieder durch die ursprünglichen zu ersetzen.
Bearbeiten: Sie können auch die JSON-Zeichenfolge erstellen und dann dort Swaps durchführen. Hier ist ein sehr kurzes Beispiel mit Ersatz
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt << Sort(Replace Table, By(:sex), Order(Descending));
replacements = ["F" => "$002$", "M" => "$001$"];
:sex << Set Each Value(replacements[:sex]);
result = [=> ];
For(i = 1, i <= N Rows(dt), i += 1,
If(!Contains(result, dt:sex[i]),
result[dt:sex[i]] = [=> ]
);
If(!Contains(result[dt:sex[i]], dt:age[i]),
result[dt:sex[i]][dt:age[i]] = [=> ]
);
If(!Contains(result[dt:sex[i]][dt:age[i]], dt:name[i]),
result[dt:sex[i]][dt:age[i]][dt:name[i]] = [=> ]
);
result[dt:sex[i]][dt:age[i]][dt:name[i]]["height"] = dt:height[i];
result[dt:sex[i]][dt:age[i]][dt:name[i]]["weight"] = dt:weight[i];
);
json_str = Substitute(As JSON Expr(result), replacements << get values, replacements << get keys);
Write(json_str);
Dies würde eine ganze Reihe von Änderungen erfordern, um es robuster und dynamischer zu machen (Funktion zum Erstellen von Ersatzschlüsseln, Verwendung von Teilmengen, um die Manipulation der Originaldaten zu vermeiden / Nutzung von Spalteneigenschaften hierfür)
Betreff: JMP-Tabelle als JSON exportierenIch habe vor einiger Zeit an einem JMP-zu-JSON-Skript gearbeitet. Hier ist die aktuelle Iteration. Was das Sortieren der JSON-Datei ohne alphabetische Schlüsselreihenfolge (basierend auf einer Wertereihenfolgeeigenschaft?) betrifft, würde dies eine weitere Komplexitätsebene erfordern, da der JSON-Ausdruck in inkrementellen Schritten geschrieben werden müsste, denke ich, anstatt sich auf die Funktion „As JSON Expr()“ zu verlassen.
Außerdem habe ich noch kein JSON-zu-JMP-Skript geschrieben, um dies wieder in eine Datentabelle umzuwandeln. Das Schema, das ich hier verwendet habe, ist mein eigenes, selbst entwickeltes Schema.
Names Default To Here( 1 );
dt = Current Data Table();
aa = Associative Array();
aa["name"] = dt << Get Name( "Ignore Extension" );
// get table variables
tvarnames = dt << get table variable names;
If( N Items( tvarnames ),
aa["table variables"] = Associative Array();
For Each( {tvar, i}, tvarnames,
Insert Into( aa["table variables"], tvar, dt << get table variable( tvar ) )
);
);
// get table scripts
tscriptnames = dt << get table script names;
If( N Items( tscriptnames ),
aa["table scripts"] = Associative Array();
For Each( {tscript, i}, tscriptnames,
// tscript = "DOE Dialog"
Insert Into( aa["table scripts"], tscript, Char( dt << get script( tscript ) ) )
);
);
// get script group names
script_groups = dt << get script groups names;
// iterate through each script group and get a list of the script in the group, add that to the associative array as a character string
If( N Items( script_groups ),
aa["script groups"] = Associative Array();
For Each( {scrgroup, i}, script_groups,
//scrgroup="FIT Y BY X"
Insert Into( aa["script groups"], scrgroup, Char( dt << get script group( scrgroup ) ) )
);
);
// capture row states
// captured as a string representation, because as json expr() doesn't handle associative array elements that are lists or matrices very well
aa["row states"] = Char( dt << get row states );
// get labeled columns
// note that the jmp data table stores these as a table property and not as a property for each column
aa["label columns"] = Char( dt << get label columns );
// get columns, column properties and data
aa["columns"] = Associative Array();
For( i = 1, i <= N Cols( dt ), i++,
col = Column( dt, i );
colname = col << get name;
// create column entry
aa["columns"][colname] = Associative Array();
// column order
aa["columns"][colname]["column order"]=i;
// modeling type
aa["columns"][colname]["modeling type"] = col << get modeling type;
// data type
aa["columns"][colname]["data type"] = col << get data type;
// format
aa["columns"][colname]["format"] = col << get format;
// get column properties
colproperties = col << get properties list;
If( N Items( colproperties ),
// note that << get properties list returns a list of expressions, converting them to character
For( k = 1, k <= N Items( colproperties ), k++,
colproperties[k] = Char( colproperties[k] )
);
//add properties element
aa["columns"][colname]["properties"] = Associative Array();
//add element for each property, capturing as character string to avoid expression eval issues
For Each( {prop, k}, colproperties, aa["columns"][colname]["properties"][prop] = Char( col << get property( prop ) ) );
);
// get data
aa["columns"][colname]["data"] = As List( col << get values );
);
Show( aa );
nw = New Window( "Complete Data Table as JSON", sb = Text Box( char(As JSON Expr( aa )), <<SET wrap="">" if you want to save a text file ; file(path || "jmpdt json.json", as json expr(aa), mode("replace")); * ode></SET>Betreff: JMP-Tabelle als JSON exportierenDanke. Das funktioniert super.