Esporta tabella JMP come JSONEstendendo l'eccellente risposta di @Craige_Hales in JSON <=> JMP , esiste un modo per convertire una tabella JMP in un file JSON che preservi l'ordine delle righe della tabella originale (per una migliore leggibilità)? Utilizzo di JMP 17.2.0.
Organizzazione dei contenutiFusione e pulizia dei datiCondivisione e comunicazione dei risultatiRe: Esporta tabella JMP come JSONIn quale formato dovrebbe essere modificata questa tabella JMP?

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
}
]
L'ordine delle righe non viene mantenuto in base all'ordine degli elementi nell'elenco?
Re: Esporta tabella JMP come JSONCiao @jthi ,
Grazie per la risposta. Avrei dovuto includere più dettagli. L'ordine delle chiavi non è preservato negli array associativi. Ad esempio, l'ordine del sesso non è preservato nello script qui sotto.
Immagino che questo risultato richiederà una soluzione completamente nuova. Sono curioso di sapere se qualcuno è in grado di capirlo.
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 ) );
Re: Esporta tabella JMP come JSONNon sono ancora sicuro del formato che stai cercando, riesco a vedere cosa crea lo script (se ricordo bene non è un JSON valido perché le chiavi non sono stringhe) ma vuoi sostanzialmente raggrupparli in base a qualcosa (in questo caso sesso -> età -> nome che sono chiavi e poi nome ha un valore con più chiavi). Cosa stai cercando di fare alla fine?
Re: Esporta tabella JMP come JSONL'output dovrebbe essere come quello sottostante, fatta eccezione per l'inversione dell'ordine di "F" e "M".
{
"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
}
}
}
}Re: Esporta tabella JMP come JSONAnche i nomi hanno cambiato ordine nel tuo esempio. Solo lo strato più esterno deve mantenere un ordine specifico?
Penso che nessuno dei metodi esistenti per creare direttamente JSON da JMP supporti un formato del genere e poiché JMP non ha nulla di simile a OrderedDict da Python, le chiavi saranno sempre ordinate. Se hai JMP18 potresti forse utilizzare l'integrazione Python. In JMP/JSL penso che dovresti affidarti ad alcune parti per la creazione di stringhe. Un'altra opzione in JSL è che potresti molto probabilmente aggiungere informazioni extra ai tuoi dati per forzare l'ordine, creare un array associativo, creare una stringa JSON da quello (non salvare ancora) e quindi utilizzare Substitute per sostituire quei valori con quelli originali.
Modifica: potresti anche creare la stringa JSON e poi effettuare degli scambi lì. Ecco un esempio molto veloce usando substitute
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);
Ciò richiederebbe un bel po' di cambiamenti per renderlo più robusto e dinamico (funzione per creare chiavi di sostituzione, utilizzo di sottoinsiemi per evitare di manipolare i dati originali / utilizzo di proprietà di colonna per questo)
Re: Esporta tabella JMP come JSONStavo lavorando su uno script JMP in JSON un po' di tempo fa. Ecco la sua iterazione attuale. Per quanto riguarda l'ordinamento del file JSON senza ordine alfabetico delle chiavi (basato su una proprietà di ordine dei valori?), ciò richiederebbe un altro livello di complessità, scrivendo l'espressione JSON in passaggi incrementali, credo, piuttosto che basarsi sulla funzione "As JSON Expr()".
Inoltre, non ho ancora scritto uno script JSON to JMP per riconvertirlo in una tabella dati. Lo schema che ho usato qui è il mio schema home-grown.
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>Re: Esporta tabella JMP come JSONGrazie. Funziona benissimo.