JSON <=> JMPTout,
J'ai une question en 2 parties.
Partie 1.
Disons que j'ai un fichier JSON de ce type :
[
{
"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 d'une 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. Le simple fait de l'enregistrer 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)puis je reçois 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 <=> JMPMerci Craig,
Bon indice pour moi d'utiliser
!Contains()
J'ai commencé à créer des AA pour chaque colonne et à obtenir des clés pour obtenir des valeurs uniques pour ce niveau particulier afin de les parcourir et de le rendre trop compliqué. Votre méthode est beaucoup plus simple.
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 )
Re : JSON <=> JMPpartie 2, en utilisant dt2 de la partie 1. Pour chaque ligne, créez la clé + AA si ce n'est déjà fait, puis ajoutez la clé de niveau suivante. 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 <=> JMPpartie 1 réponse
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 encodées dans les noms de colonne. 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'étiquette puisse être supprimée car elle est désormais redondante.
transposed and column-izedtransposé et colonisé
Re : JSON <=> JMPJe suppose qu'il devrait utiliser des noms génériques comme "Column1" alors ou si cela se fait via l'interface graphique, il suffit d'avoir l'option de le saisir.
Je pense qu'il devrait 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 <=> JMPSalut,
À première vue, votre fichier JSON d'origine n'inclut aucun en-tête de colonne qui confond ma routine d'importation JMP JSON. Juste une pensée.
Meilleur,
TS