JSON <=> JMPTous,
J'ai une question en 2 parties.
Partie 1.
Disons que j'ai un fichier JSON de ce genre :
[
{
"Cat1": {
"SubCat1": {
"Param1": "AA",
"Param2": "BB"
},
"SubCat2": {
"Param1": "AB",
"Param2": "BC"
}
},
"Cat2": {
"SubCat1": {
"Param1": "BA",
"Param2": "BC"
},
"SubCat2": {
"Param1": "CB",
"Param2": "BD"
}
}
}
]Comment puis-je l'importer dans JMP (à l'aide de l'interface graphique ou de scripts) pour obtenir quelque chose comme ceci :

Jusqu'à présent, je reçois juste un tas de colonnes et une ligne.
Partie 2.
Maintenant, je dois convertir la table JMP en fichier JSON. Disons que j'ai un fichier JMP qui ressemble à ci-dessus. L'enregistrer simplement au format JSON conduirait à ceci :
[
{
"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"
}
]Ce qui n'est pas bon.
Mais si je construis un AA qui ressemble à ceci et que je l'enregistre au format 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)alors j'obtiens JSON dont j'ai besoin.
Question - quel est le moyen le plus efficace de construire AA comme ça à partir d'une table JMP comme ça ?
Merci!
Tableau de donnéesAutreScriptRe : JSON <=> JMPSalut,
À première vue, votre fichier JSON d'origine n'inclut aucun en-tête de colonne que ma routine d'importation JMP JSON confond. Juste une pensée.
Meilleur,
ST
Re : JSON <=> JMPJe suppose qu'il devrait alors utiliser des noms génériques tels que "Column1" ou, si cela est fait via l'interface graphique, avoir simplement l'option de le saisir.
Je pense qu'il devrait y avoir une option pour dire - tout du niveau 1 va à cette colonne, tout du niveau 2 va à cette colonne, et ainsi de suite...
Re : JSON <=> JMPréponse partie 1
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 table d'importation contient les données, sur une ligne, mais codées dans les noms de colonnes. Après la transposition, utilisez la fonction word() dans une formule de colonne pour diviser le nom en pointillés en 3 colonnes. Supprimez la formule afin que la colonne d'étiquettes puisse être supprimée car elle est désormais redondante.
transposé et colonisé
Re : JSON <=> JMPpartie 2, en utilisant dt2 de la partie 1. Pour chaque ligne, créez la clé + AA si elle n'est pas déjà créée, puis ajoutez la clé de niveau suivant. Cela conservera la dernière occurrence d'une ligne dupliquée.
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"}
}
}
Re : JSON <=> JMPComme @Thierry_S souligné, le format JSON utilise Les données plutôt que des noms pour les clés. Votre exemple de save-to-json préféré de JMP utilise la colonne des noms pour les clés.
Les formats Pandas JSON peuvent éliminer une partie de la redondance, et JMP peut les lire (mais pas les écrire directement. @Audrey_Shul )