1 つの列内のすべてのセルを検索して特定のコンテンツを見つけるこんにちは、みんな、
各行に異なる文字列を含む列を持つ jmp データテーブルがあります。その列をループして、そのセル内の文字列の特定の部分を検索できるかどうかを知りたいです。
これは文字列の例です。
クラス: 10 テーブル:15 統計: NA loc: NA 教師: サム --> セルの内容
クラス: 11 テーブル:11 ステータス: NA 場所: NA 教師: サム
課題は、クラス番号とテーブル番号が異なることです。ただし、必要なのは「Class: #」で始まるセルを検索し、残りのセルをリストに取得することだけです。
そこで私の質問は、その特定の列で部分的なセル検索を行うことはできますか?
自動化とスクリプト作成基本的なデータ分析とモデリングRe: 1 つの列内のすべてのセルを検索して特定の内容を見つけるこれに対処する可能な方法の 1 つです
Names Default To Here( 1 );
dt = Current Data Table();
foundList = {};
For Each Row(
If(
Word( 1, thestringcolumn, " " ) & Is Missing(
Num( word * 2, thestringcolumn, " " )
) == 0,
Insert Into(
foundList,
Substr(
thestringcolumn,
Length( Word( 1, thestringcolumn, " " ) )
+Length( Word( 2, thestringcolumn, " " ) ) + 2
)
)
)
);Re: 1 つの列内のすべてのセルを検索して特定の内容を見つける文字列形式に応じて、Recode を使用できる可能性があります (一致しない場合はテキストを保持するがチェックされていないことに注意してください)

または、For Each Row を使用したスクリプトを作成します。 For Each Row を使用する場合、文字列の解析と結果の保存方法にさまざまなオプションがあります。以下に別の例を示します。
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(2),
Compress File When Saved(1),
New Column("Column 1",
Character,
"Nominal",
Set Values(
{"Class: 10 Table:15 Stat:NA loc:NA teacher:Sam",
"Class: 11 Table:11 Stat:NA loc:NA teacher:Sam"}
)
)
);
result = {};
For Each Row(dt,
res = Regex(:Column 1, "^(Class: \d+) (.*)?", "\2");
If(!IsMissing(res),
Insert Into(result, res);
);
);
show(result);
// result = {"Table:15 Stat:NA loc:NA teacher:Sam", "Table:11 Stat:NA loc:NA teacher:Sam"};Re: 1 つの列内のすべてのセルを検索して特定の内容を見つけるありがとう@jthi 。これは、上で示した例では完全に機能します。
フォローアップの質問があります。次の文字列リストがあるとします。
10::クラス:A
11::クラス: A1
12::クラス: A2
..
20::クラスB
21::クラスB1
22::クラスB1
30::クラスC
31::クラスC1
32::クラスC2
クラスごとにリストを作成したいとします。最初のものを ClassAList = (11::Class: A ,11::Class: A ,11::Class: A ); にしたいと思います。
regex() を変更して、文字列内の先頭の数字を検索し、それを対応するリストに移動しようとしました。私は次のようなものを使用しました: Regex("10:::Class" , "[1]")
ここでの問題は、すべての文字列にわたって [1] を探していることです。正規表現が一致を検索するインデックスを選択することはできますか?
ここでのもう 1 つの問題は、文字列全体ではなく 1 のみを返すことです。
ご指導いただければ幸いです。
Re: 1 つの列内のすべてのセルを検索して特定の内容を見つけるこれにより、何ができるかがわかるかもしれません
Names Default To Here(1);
mylist = {"10::Class: A", "11::Class: A1", "12::Class: A2", "20::Class B", "21::Class B1",
"22::Class B1", "30::Class C", "31::Class C1", "32::Class C2"};
class_pattern = "\d+::(Class:? [A-Z])";
aa = Associative Array();
For Each({myitem}, mylist,
res = Regex(myitem, class_pattern, "\1");
If(!Contains(aa, res),
aa[res] = {};
);
Insert Into(aa[res], myitem);
);
show(aa);
正規表現パターンの説明については、 https://regex101.com/r/itqqww/1
Re: 特定のコンテンツを見つけるために 1 つの列内のすべてのセルを検索する@jthi さん、ありがとうございます。完璧に動作します。
フォローアップの質問:
最初の数字のみに基づいてリストをサブグループにグループ化したいと思います。そのために正規表現アンカーを使用しようとしました。しかし、最初の数字のみに一致するのではなく、最初の数字とそれに続く数字に一致します。ご指導いただければ幸いです。
Re: 特定のコンテンツを見つけるために 1 つの列内のすべてのセルを検索するクラス B1 の部分のことですか? 括弧内に \d? を追加することで正規表現を変更できます ( https://regex101.com/r/Yfh6pZ/1 )。\d は数字と一致し、? はその前のトークンに 0 回または 1 回一致します。数字のないグループをキャプチャしたくない場合は、? を省略するか、{1} に置き換えます。

[
"Class B" => {"20::Class B"},
"Class B1" => {"21::Class B1", "22::Class B1"},
"Class C" => {"30::Class C"},
"Class C1" => {"31::Class C1"},
"Class C2" => {"32::Class C2"},
"Class: A" => {"10::Class: A"},
"Class: A1" => {"11::Class: A1"},
"Class: A2" => {"12::Class: A2"}
]