区切り文字を使用して列データを分割し、別の列区切り文字と一致させる JSL スクリプトに関するヘルプが必要です。こんにちは皆さん
私はJMP17を使用していますが、以下の入力データを目的の出力データに処理するためのJSLスクリプトに関する支援が本当に必要です。
入力データテーブル:
| データ| ラベル | ID |
|----------|----------|----------|
| 1_1_64_5_2 | D1_DD4_FF1_FIN1_GPES2 | アップル1 |
| 1_1_2 | D2_D3_D4 | アップル1 |
| 1_2_68_5_6 | D1_DD4_FF1_FIN1_GPES2 | オレンジ1 |
| 1_2_2 |翻訳:オレンジ1 |
| 2_1_50_3_10 | D1_DD4_FF1_FIN1_GPES2 | グレープ1 |
| 2_1_2 |翻訳:グレープ1
出力形式: (列の順序は問いません)
| ID| ラベル| データ|
|----------|----------|----------|
| アップル1 | D1 | 1 |
| アップル1 | DD4 | 1 |
| アップル1 | FF1 | 64 |
| アップル1 | FIN1 | 5 |
| アップル1 | GPES2 | 2 |
| アップル1 | D2| 1 |
| アップル1 | D3| 1 |
|アップル1 4 | 10 ... 2 |
|オレンジ1| 1 | 1 2 3 4 5 6 7 8 9 10 11 12 1 |
| オレンジ1| DD4 | 2|
| オレンジ1| FF1 | 68|
|オレンジ1|フィン1 5 |
| オレンジ1| GPES2 | 6 |
| オレンジ1| D2| 1 |
|オレンジ1| D3| 2 |
|オレンジ1| 4 | 10 ... 2 |
|グレープ1 1 年生2 |
| グレープ1 | DD4 | 1|
|グレープ1 FF1 | 50|
|グレープ1フィン1 3 |
| グレープ1 | GPES2 | 10 |
| グレープ1 | D2| 2 |
|グレープ1 D3| 1 |
|グレープ1 4 | 10 ... 2 |
自動化とスクリプト基本的なデータ分析とモデリングデータアクセスRe: 区切り文字を使用して列データを分割し、別の列区切り文字と一致させる JSL スクリプトに関するヘルプが必要です。分割データサンプル表を提供していただけますか? テキストだけでは開始状況を理解するのは少し難しいです。
Re: 区切り文字を使用して列データを分割し、別の列区切り文字と一致させる JSL スクリプトに関するヘルプが必要です。分割データすべてのラベルとデータ値に同じ数の項目が含まれていると想定しています。そうであれば、これは機能します。そうでない場合は、それをチェックするためにもう少しロジックを追加する必要がありますが、これはデータを処理するための迅速な方法になります。
// this would be whatever your input table name is<BR />dt0 = Data table("Input Table");
dt1 = new table("Output table");
dt1<<NEW column=""></NEW>Re: 区切り文字を使用して列データを分割し、別の列区切り文字と一致させる JSL スクリプトに関するヘルプが必要です。分割データ出発点が何なのか分からないので、テキスト ファイルではなくデータ テーブルがあると仮定します。

データとラベルの列を選択し、テキストを列に使用します。

これらの「古い」列を削除します(または末尾に移動します)。
次に、複数のシリーズスタックを使用してデータをスタックします。

余分な列を削除し、列の順序を変更し、列の名前を変更する

不足している行を削除する

結果を確認し、JMP が作成したスクリプト (またはワークフロー) を実行します。
ワークフローも添付されており (クリーンアップが必要になる場合があります)、以下のワークフローに基づいてクリーンアップされたスクリプトも添付されています (ニーズに応じてさらに堅牢にすることができます)。
もっと見る...
Names Default To Here(1);
dt = Current Data Table();
dt << Text to Columns(columns(:" Data"n, :Label), Delimiters("_"));
dt << Delete Columns(:" Data"n, :Label);
dt_stacked = dt << Stack(
columns(:Data 1, :Data 2, :Data 3, :Data 4, :Data 5, :Label 1, :Label 2, :Label 3, :Label 4, :Label 5),
Number of Series(2),
Contiguous,
Output Table("Stacked result")
);
dt_stacked << Delete Columns(:Label, :Label 2);
Column(dt_stacked, "Data 2") << Set Name("Label");
dt_stacked << Move Selected Columns({:Label}, after(:ID));
dt_stacked << Select Where(:Label == "") << Delete Rows;
Re: 区切り文字を使用して列データを分割し、別の列区切り文字と一致させる JSL スクリプトに関するヘルプが必要です。分割データ私が提案する改善点は次のとおりです:
- 一般的に、Current Data Table() は使用しないでください。この場合、それを使用して初期テーブルを選択できる可能性がありますが、参照がすでにあるため、変更し続ける必要はありません (たとえば、 current data table(dt1); は不要であり、問題を引き起こす可能性があります)。
- For Each Row を使用するときは特定のテーブルをループし、現在のテーブルに依存しないでください (for each row(dt0,...))
- For Each + Across を使って複数のコンテナをループすることもできます。Across を使って異なる長さのコンテナを処理するときに、異なる動作を強制することもできます。
- 列名と値がわかっている場合は、<< Add rows で値を追加できますが、面倒になる可能性があります (通常、私はあなたのように行を追加し、その後に値を追加します)
もっと見る...
Names Default To Here(1);
dt_input = Current Data Table();
// dt_input = Data table("Input Table");
dt_result = New Table("Output table");
dt_result << New Column("ID", Character, Nominal);
dt_result << New column("Label", Character, Nominal);
dt_result << New Column("Data", Character, Nominal);
For Each Row(dt_input,
id_val = Column(dt_input, "ID")[];
data_vals = Words(Column(dt_input, "Data")[], "_");
label_vals = Words(Column(dt_input, "Label")[], "_");
For Each({{cur_label, cur_data}}, Across(label_vals, data_vals),
dt_result << Add Rows({ID = id_val, Label = cur_label, Data = cur_data});
);
);