列の文字列を解析し、別の列に入力しますやあ、
ProductNameを含むテーブルがあり、OUTPUT列を生成したいと思います。OUTPUT列は、ProductIDとSerial#の連結です。 Serial#を正確に解析してOUTPUT列を作成するにはどうすればよいですか?
シリアル番号の例:
- 07-08_13はシリアル番号07、08、13を意味します
- 09-12はシリアル番号09、10、11、12を意味します
- 01-03_05-08は、シリアル番号01、02、03、05、06、07、08を意味します
- 01_04_05-08は、シリアル番号01、04、05、06、07、08を意味します
- 09_11_13_14はシリアル番号09,11,13,14を意味します

| 商品名 | 出力 |
| AABBCC_07-08_13 | AABBCC-07 |
| AABBCC_07-08_13 | AABBCC-08 |
| AABBCC_07-08_13 | AABBCC-13 |
| AABBCC_09-12 | AABBCC-09 |
| AABBCC_09-12 | AABBCC-10 |
| AABBCC_09-12 | AABBCC-11 |
| AABBCC_09-12 | AABBCC-12 |
| EEFFGG_02 | EEFFGG-02 |
| HHIIJJ_01-07 | HHIIJJ-01 |
| HHIIJJ_01-07 | HHIIJJ-02 |
| HHIIJJ_01-07 | HHIIJJ-03 |
| HHIIJJ_01-07 | HHIIJJ-04 |
| HHIIJJ_01-07 | HHIIJJ-05 |
| HHIIJJ_01-07 | HHIIJJ-06 |
| HHIIJJ_01-07 | HHIIJJ-07 |
| KKLLLMM_01-03_05-08 | KKLLLMM-01 |
| KKLLLMM_01-03_05-08 | KKLLLMM-02 |
| KKLLLMM_01-03_05-08 | KKLLLMM-03 |
| KKLLLMM_01-03_05-08 | KKLLLMM-05 |
| KKLLLMM_01-03_05-08 | KKLLLMM-06 |
| KKLLLMM_01-03_05-08 | KKLLLMM-07 |
| KKLLLMM_01-03_05-08 | KKLLLMM-08 |
| NNOOPP_01_04_05-08 | NNOOPP-01 |
| NNOOPP_01_04_05-08 | NNOOPP-04 |
| NNOOPP_01_04_05-08 | NNOOPP-05 |
| NNOOPP_01_04_05-08 | NNOOPP-06 |
| NNOOPP_01_04_05-08 | NNOOPP-07 |
| NNOOPP_01_04_05-08 | NNOOPP-08 |
| QQRRSS_09_11_13_14 | QQRRSS_09 |
| QQRRSS_09_11_13_14 | QQRRSS_11 |
| QQRRSS_09_11_13_14 | QQRRSS_13 |
| QQRRSS_09_11_13_14 | QQRRSS_14 |
データ表スクリプティングRe:列の文字列を解析し、別の列に入力しますほとんどの場合、Lagを使用して数式を記述してそれを実行できます(またはJSLを使用してスクリプトを作成できます)が、インタラクティブに実行することもできますが、かなりの手順が必要です。
1.ProductName列を選択します
2. Cols / Utilities / Text To列に移動し、区切り文字として-と_の両方を使用します

3. [テーブルとスタック]に移動し、最初の列以外のすべてを[スタック列]の選択に追加します


5.ラベル列を削除します
6.残っている両方の列を選択し、[行] / [行の選択] / [重複する行の選択]に移動して、それらの行を削除します

7.値が空のセルを1つ選択し、[一致するセルの選択]を選択して、それらの行を削除します
8.次に、両方の列を選択し、列ヘッダーを右クリックして数式を作成します

9.作成したばかりの数式を開き、、を_に変更します。

10.列/数式の名前を変更して削除します
11.必要な場合ProductNameがあります。最初のステップで誤って削除しなかった場合は、そのままにしておくことができます。

シリアル番号に応じて-または_が必要な場合は、連結式で処理できます。
編集:私は質問をもう少し正確にチェックしました、そしてこれは私がここに示したより少し複雑です。 一部のシリアル番号は番号の間にあるため、計算を追加する必要があります。 重複が削除されると一部の行が削除されるため、このソリューションはこれらでは機能しません。
Re:列の文字列を解析し、別の列に入力しますやあ@cchueng 、
いくつかの方法があります。 スクリプトベースのものもあれば(例を挙げてこれを提案している人からの返信を探す)、テキストから列への連続ラウンドを使用することもできます(例はここにあります)。解決済み:1つの列のテキストを複数の列に分割するにはどうすればよいですか? -JMPユーザーコミュニティ)次に、目的の列を選択して連結し、列の数式を使用するか、選択した列の1つを右クリックして[新しい数式の列]オプションを使用します。 concatの文字オプションを探します。列の数式はより柔軟で、多くのオプションがあります。このトピックのヘルプを参照してください( JMPで数式を作成する)。
それがあなたに何らかの方向性を与えることを願っています。
一番、
Re:列の文字列を解析し、別の列に入力します@jthi 、
あなたはそれに私を打ち負かしました。
あなたの説明はもっと詳細で、私も考えていました。
Re:列の文字列を解析し、別の列に入力しますああ、あなたの権利。 -は範囲として解釈され、_はアイテムの真の区切り文字として解釈されます
Re:列の文字列を解析し、別の列に入力しますありがとうございますが、インタラクティブな区切り文字よりもjslの方が好きです。 あなたの方法は、シリアル番号が09-12。 以下のような行を出力するはずです。 AABBCC-09とAABBCC-12だけではありません。 「-」は範囲を意味する「to」を意味します。 つまり、09-12は09、10、11、12を意味します。
| AABBCC_09-12 | AABBCC-09 |
| AABBCC_09-12 | AABBCC-10 |
| AABBCC_09-12 | AABBCC-11 |
| AABBCC_09-12 | AABBCC-12 |
Re:列の文字列を解析し、別の列に入力しますわかりました、これはうまくいくかもしれません。 For Eachを使用するため、JMP16が必要です(他のバージョンではForに置き換えることができます。 これは、コメントがほとんどまたはまったくない、スクリプト化されたソリューションであり、機能するには特定の開始テーブルが必要です(OUTPUT列が必要です)。
Names Default To Here(1);
dt = New Table("Untitled 4993",
Add Rows(32),
Compress File When Saved(1),
New Column("ProductName",
Character,
"Nominal",
Set Values(
{"AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "EEFFGG_02",
"HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "KKLLLMM_01-03_05-08",
"KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08",
"NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08",
"QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14"}
)
),
New Column("OUTPUT",
Character(16),
"Nominal",
Set Values({"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""})
)
);
Summarize(dt, uniqProd = by(:ProductName));
valList = {};
For Each({prod}, uniqProd,
prodPart = Word(1, prod, "_");
serialPart = Substr(prod, Contains(prod, "_") + 1); //remove start
possibleRanges = Words(serialPart, "_"); //if they contain -
For Each({val}, possibleRanges,
If(Contains(val, "-"), //range
rangeVals = Words(val, "-");
For Each({val1}, Index(Num(rangeVals[1]), Num(rangeVals[2])),
valToAdd = Substr("0", Length(Char(val1))) || Char(val1);
Insert Into(valList, prodPart || "-" || valToAdd)
);
,
Insert Into(valList, prodPart || "-" || Substr("0", Length(Char(val))) || Char(val))
)
);
);
dt[0,"OUTPUT"] = valList;このようなことがJMP独自のパターンマッチングで「簡単に」できるかどうか疑問に思います@Craige_Hales
Re:列の文字列を解析し、別の列に入力しますこんにちはクリス、
ProductNameの一部に対処し、誤って解析することがあるスクリプトがあります。 これまで機能していないProductNameに対処するためのコードを確認して追加できますか?
以下の例で動作します:
EEFFGG_02
HHIIJJ_01-07
KKLLLMM_01-03_05-08
以下の例ではまだ機能しません:
AABBCC_07-08_13
NNOOPP_01_04_05-08
QQRRSS_09_11_13_14
dt=current data table();
(dt << New Column( "ProductID", Character )) << Set Selected;
(dt << New Column( "OUTPUT", Character )) << Set Selected;
//Parse string in ProductName column
For Each Row(
dt,
//Assign the ProductID value
:ProductID = Word( 1, :ProductName, "_-" ); //"_"
//If the ProductName changes, capture the start and end
If( :ProductName != Lag( :ProductName, 1 ),
start = Num( Word( 2, :ProductName, "_-" ) );
end = Num( Word( 3, :ProductName, "_-" ) );
);
//Assign the OUTPUT value
:OUTPUT = :ProductID || "-" || Repeat( "0", 2 - Length( Char( start ) ) ) || Char( start );
//After end value & there is an _, set start to value after _
If( start == end & Contains( :ProductName, "_"),
start = Num( Word(-2, :ProductName, "_-" ) ),
start++);
);
Re:列の文字列を解析し、別の列に入力しますこんにちはjthi、
スクリプトをありがとうございますが、私のテーブルは実際には動的です。 毎日、異なる日付範囲のデータベースからこのテーブルを取得し、ProductNameの異なるセットが表示されます。 したがって、必ずしも32行であるとは限りません。 スクリプトはほぼ機能しますが、配列サイズに対応できますか? ありがとう。
Re:列の文字列を解析し、別の列に入力しますかなり簡単なはずです。 プルされたデータには、シリアル番号と同じ数の行がありますか?
Re:列の文字列を解析し、別の列に入力しますこんにちはjthi、
はい、行数はシリアル番号の数と一致しました。
Re:列の文字列を解析し、別の列に入力しますその場合は、すでに処理できるはずです。 小さな変更を行いました(欠落している場合はOUTPUT列を作成します)。 現在、データテーブルがProductNamesで並べ替えられているという事実に依存しているため、ある時点で問題が発生する可能性があります。または、入力テーブルが並べ替えられていることを確認できます(最も簡単な解決策)。
ProductNamesを持つuniqProdという名前のリスト変数がある限り、ForEachパーツはデータテーブルなしでも使用できるはずです。 その後は、datatableに値を追加する方法を理解しているだけです。
Names Default To Here(1);
//Test table
/*
dt = New Table("Untitled 4993",
Compress File When Saved(1),
New Column("ProductName",
Character,
"Nominal",
Set Values(
{"AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "EEFFGG_02",
"HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "KKLLLMM_01-03_05-08",
"KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08",
"NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08",
"QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14"}
)
)
);
*/
dt = Current Data Table();
Summarize(dt, uniqProd = by(:ProductName));
valList = {};
For Each({prod}, uniqProd, //loop for each ProductName
prodPart = Word(1, prod, "_");
serialPart = Substr(prod, Contains(prod, "_") + 1); //remove start
possibleRanges = Words(serialPart, "_"); //if they contain -
For Each({val}, possibleRanges, //Loop for serialnumber inside the ProductName
If(Contains(val, "-"), //range
rangeVals = Words(val, "-");
For Each({val1}, Index(Num(rangeVals[1]), Num(rangeVals[2])),
valToAdd = Substr("0", Length(Char(val1))) || Char(val1);
Insert Into(valList, prodPart || "-" || valToAdd)
);
,
Insert Into(valList, prodPart || "-" || Substr("0", Length(Char(val))) || Char(val))
)
);
);
//if starting table doesn't have OUTPUT column create it
If(!Contains(dt << Get Column Names("String"), "OUTPUT"),
dt << New Column("OUTPUT", Character, "Nominal");
);
//dt[0,"OUTPUT"] = valList; subscripting, maybe a bit more difficult to understand
dt:OUTPUT << Set Values(valList);
スクリプトが実行しようとしている簡略化されたバージョン:
1.スクリプトはProductName列のすべての一意の値を取得します
2.2つの部分のForEachループでそれぞれのスクリプトループ
3.最初のループは一意の値をループし、それらを製品と数値の部分に分割します
4.次に、シリアル番号の部分を再度ループして、単一の値に分割します。 これらの単一の値はProductパーツと連結され、文字列がvalListリストに挿入されます(この4.は、ここで説明したほど単純ではありません)。
5.両方のループが終了すると、すべての可能なシリアル番号を含むリストが作成されます。 製品部分はアルファベット順になります。
6.このリストは、存在する場合はOUTPUTに追加され、存在しない場合は最初に作成されます。
Re:列の文字列を解析し、別の列に入力しますこんにちはjthi、
ProductNameが文字と数字が混在している場合、スクリプトは機能しません。 テーブルを付けました。 これは私のproductNameのほとんどがどのように見えるかです。 手伝ってくれてありがとう。