JMP テーブルを JSON としてエクスポート@Craige_HalesのJSON <=> JMPに関する優れた回答を拡張すると、JMP テーブルを JSON ファイルに変換して、元のテーブルの行順序を維持する方法はありますか (人間が読みやすいように)? JMP 17.2.0 を使用します。
コンテンツの編成データのブレンドとクリーンアップ結果の共有と伝達Re: JMP テーブルを JSON としてエクスポートこの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
}
]
行の順序はリスト内の項目の順序に基づいて保持されるのではないですか?
Re: JMP テーブルを JSON としてエクスポートこんにちは@jthi さん
ご返信ありがとうございます。もっと詳細を記載すべきでした。連想配列ではキーの順序は保持されません。たとえば、以下のスクリプトでは性別の順序は保持されません。
この結果にはまったく新しい解決策が必要になると思います。誰かがそれを解明できるかどうか興味があります。
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: JMP テーブルを JSON としてエクスポートあなたが探しているフォーマットについてはまだよくわかりません。スクリプトが作成するものはわかります (正しく覚えていれば、キーが文字列ではないため有効な JSON ではありません)。ただし、基本的には何かに基づいてグループ化したいのです (この場合、性別 -> 年齢 -> 名前がキーであり、名前にはさらにキーを持つ値があります)。最終的に何をしようとしているのですか?
Re: JMP テーブルを JSON としてエクスポート出力は以下のようになりますが、「F」と「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: JMP テーブルを JSON としてエクスポートあなたの例では、名前の順序も変更されています。最も外側のレイヤーだけが特定の順序を維持する必要がありますか?
JMP から直接 JSON を作成する既存の方法はいずれもそのような形式をサポートしていないと思います。また、JMP には Python の OrderedDict のようなものがないため、キーは常にソートされます。JMP18 をお持ちの場合は、Python 統合を利用できるかもしれません。純粋に JMP/JSL では、文字列の構築にいくつかの部分に依存することになると思います。JSL のその他のオプションとしては、データに追加情報を追加して順序を強制し、連想配列を構築し、そこから JSON 文字列を構築し (まだ保存しないでください)、Substitute を使用してそれらの値を元の値に戻すことができます。
編集: JSON文字列を作成して、そこでスワップを実行することもできます。これは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);
これをより堅牢かつ動的にするには、かなりの変更が必要になります (置換キーを作成する関数、元のデータの操作を回避するためにサブセットを使用する / これには列プロパティを活用する)
Re: JMP テーブルを JSON としてエクスポートしばらく前に、JMP から JSON へのスクリプトに取り組んでいました。これが現在の反復です。JSON ファイルをアルファベット順のキー順序なしで順序付ける (値の順序プロパティに基づいて?) には、"As JSON Expr()" 関数に頼るのではなく、JSON 式を段階的に記述するという、もう 1 つの複雑なレイヤーが必要になると思います。
また、これをデータ テーブルに戻すための JSON から JMP へのスクリプトはまだ作成していません。ここで使用したスキーマは、私が独自に作成したスキーマです。
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: JMP テーブルを JSON としてエクスポートありがとう。うまくいきました。