JSON <=> JMPTutto,
Ho una domanda in 2 parti.
Parte 1.
Diciamo che ho un file JSON di questo tipo:
[
{
"Cat1": {
"SubCat1": {
"Param1": "AA",
"Param2": "BB"
},
"SubCat2": {
"Param1": "AB",
"Param2": "BC"
}
},
"Cat2": {
"SubCat1": {
"Param1": "BA",
"Param2": "BC"
},
"SubCat2": {
"Param1": "CB",
"Param2": "BD"
}
}
}
]Come dovrei importarlo in JMP (usando la GUI o gli script) per ottenere qualcosa del genere:

Finora sto solo ricevendo un mucchio di colonne e una riga.
Parte 2.
Ora ho bisogno di convertire la tabella JMP in file JSON. Diciamo che ho un file JMP simile a quello sopra. Il semplice salvataggio come JSON porterebbe a questo:
[
{
"Category" : "Cat1",
"SubCategory" : "SubCat1",
"Parameter" : "Param1",
"Value" : "AA"
},
{
"Category" : "Cat1",
"SubCategory" : "SubCat1",
"Parameter" : "Param2",
"Value" : "BB"
},
{
"Category" : "Cat1",
"SubCategory" : "SubCat2",
"Parameter" : "Param1",
"Value" : "AB"
},
{
"Category" : "Cat1",
"SubCategory" : "SubCat2",
"Parameter" : "Param2",
"Value" : "BC"
},
{
"Category" : "Cat2",
"SubCategory" : "SubCat1",
"Parameter" : "Param1",
"Value" : "BA"
},
{
"Category" : "Cat2",
"SubCategory" : "SubCat1",
"Parameter" : "Param2",
"Value" : "BC"
},
{
"Category" : "Cat2",
"SubCategory" : "SubCat2",
"Parameter" : "Param1",
"Value" : "CB"
},
{
"Category" : "Cat2",
"SubCategory" : "SubCat2",
"Parameter" : "Param2",
"Value" : "BD"
}
]Il che non va bene.
Ma se costruisco un AA simile a questo e lo salvo come JSON:
AA = [
"Cat1"=> [
"SubCat1"=> [
"Param1"=> "AA",
"Param2"=> "BB"
],
"SubCat2"=> [
"Param1"=> "AB",
"Param2"=> "BC"
]
],
"Cat2"=> [
"SubCat1"=> [
"Param1"=> "BA",
"Param2"=> "BC"
],
"SubCat2"=> [
"Param1"=> "CB",
"Param2"=> "BD"
]
]
];
JSON = As JSON Expr(AA);
Save Text File("C:\Users\MyUser\JMPtoJSON\AAtoJSON.json", JSON)quindi ottengo JSON di cui ho bisogno.
Domanda: qual è il modo più efficiente per costruire un AA del genere da una tabella JMP del genere?
Grazie!
Tabella datiAltroScriptingOggetto: JSON <=> JMPGrazie Craig,
Buon suggerimento per me da usare
!Contains()
Ho iniziato a creare AA per ogni colonna e ottenere chiavi per ottenere valori univoci per quel particolare livello da ripetere su di essi e l'ho reso troppo complicato. Il tuo metodo è molto più semplice.
Oggetto: JSON <=> JMPCome @Thierry_S sottolineato, il formato JSON sta usando dati piuttosto che nomi per chiavi. Il tuo esempio di save-to-json preferito di JMP utilizza la colonna nomi per le chiavi.
I formati Pandas JSON possono eliminare parte della ridondanza e JMP può leggerli (ma non scriverli direttamente. @Audrey_Shull )
Oggetto: JSON <=> JMPparte 2, usando dt2 dalla parte 1. Per ogni riga, crea la chiave + AA se non è già stata creata, quindi aggiungi la chiave di livello successivo. Ciò manterrà l'ultima occorrenza di una riga duplicata.
result = [=> ];
For( i = 1, i <= N Rows( dt2 ), i += 1,
If( !Contains( result, dt2:category[i] ),
result[dt2:category[i]] = [=> ]
);
If( !Contains( result[dt2:category[i]], dt2:SubCategory[i] ),
result[dt2:category[i]][dt2:SubCategory[i]] = [=> ]
);
result[dt2:category[i]][dt2:SubCategory[i]][dt2:Parameter[i]] = dt2:value[i];
);
Write( As JSON Expr( result ) );
{
"Cat1":
{
"SubCat1":{"Param1":"AA","Param2":"BB"},
"SubCat2":{"Param1":"AB","Param2":"BC"}
},
"Cat2":
{
"SubCat1":{"Param1":"BA","Param2":"BC"},
"SubCat2":{"Param1":"CB","Param2":"BD"}
}
}
Oggetto: JSON <=> JMPparte 1 risposta
dt1 = Open(
Char To Blob(
"\[[
{
"Cat1": {
"SubCat1": {
"Param1": "AA",
"Param2": "BB"
},
"SubCat2": {
"Param1": "AB",
"Param2": "BC"
}
},
"Cat2": {
"SubCat1": {
"Param1": "BA",
"Param2": "BC"
},
"SubCat2": {
"Param1": "CB",
"Param2": "BD"
}
}
}
]]\"
),
json
);
dt2 = dt1 << Transpose( columns( dt1 << getcolumnnames ) ); // the 8 columns become the 8 rows
name = {"category", "SubCategory", "Parameter"}; // add these new column names
For( i = 1, i <= nitems(name), i += 1,
nc = dt2 << New Column( name[i], formula( Word( i, label, "." ) ) );
dt2 << runformulas; // run,
nc << deleteformula(); // and remove so label is no longer referenced
);
// pretty it up...
dt2:row1 << setname( "value" );
dt2 << deletecolumns( label ); // unreferenced now, and not needed
// move value to end if desired...
dt2:value << setselected; dt2 << move selected columns( to last ); dt2 << Clear Column Selection(); La tabella di importazione ha i dati, in una riga, ma codificati nei nomi delle colonne. Dopo la trasposizione, usa la funzione word() in una formula di colonna per dividere il nome puntato in 3 colonne. Rimuovi la formula in modo che la colonna dell'etichetta possa essere rimossa poiché ora è ridondante.
transposed and column-izedtrasposto e colonnato
Oggetto: JSON <=> JMPImmagino che dovrebbe usare nomi generici come "Column1" quindi o se fatto tramite GUI basta avere l'opzione per inserirlo.
Penso che dovrebbe avere un'opzione da dire: tutto dal livello 1 va a questa colonna, tutto dal livello 2 va a quella colonna e così via...
Oggetto: JSON <=> JMPCiao,
A prima vista, il tuo file JSON originale non include alcuna intestazione di colonna che la mia confusa routine di importazione JSON JMP. Solo un pensiero.
Migliore,
ST