部分文字列のリストを使用した列検索定義された部分文字列のリストから、値が一致する行を取得しようとしています。 以下の例。
私が興味を持っている部分的な文字列は、「aaa」または「aabb」のいずれかです。 以下のJSLから始めました。 理想的には、結果は[1,2,4,5,7,8,11]です。 以下のスクリプトは、最後のスクリプト(11)を除くすべてを取得できました。 それにもかかわらず、おそらく私が持っているものよりもエレガントな解決策があります。 助けに感謝します!

names default to here(1);
keys_list = {"aaa", "aa bb"};
dt = current data table();
Row_list = dt <<GET rows="" where=""></GET>スクリプティングRe:部分文字列のリストを使用した列検索私はおそらくここでこのようなもので通常の正規表現を使用します。 遅くなりすぎると、もっと複雑なことを考え始めるかもしれません
Names Default To Here(1);
keys_list = {"aaa", "aa bb"};
dt = Current Data Table();
regex_pattern = "(" || Concat Items(keys_list, "|") || ")";
row_list = [];
For Each Row(dt,
If(!IsMissing(Regex(lowercase(:TEST), regex_pattern)),
Insert Into(row_list, Row())
);
);
show(row_list); //row_list = [1, 2, 4, 5, 7, 8, 11];Re:部分文字列のリストを使用した列検索これがこの問題を解決するための私のアプローチです
names default to here(1);
keys_list = {"aaa", "aa bb"};
dt = current data table();
row_list=[];
For( i = 1, i <= N Rows( dt ), i++,
For( k = 1, k <= N Items( keys_list ), k++,
If( Contains( :test[i], keys_list[k] ),
row_list = row_list || Matrix( i );
Break();
)
)
);
show(sort ascending(Row_list));Re:部分文字列のリストを使用した列検索@jthi 、 @txnelson 、 @vince_faller解決策をありがとう! 私は実際にもう1つのシナリオについて言及するのを忘れました。 keys_listの2番目の要素は、スペース区切り文字で区切られた2つの単語である「aabb」です。 私が取り組んでいるデータセットでは、区切り文字が他の特殊文字である場合があります。 たとえば、値が「aa-bb」の12番目の行がある場合、その行も呼び出して、[1,2,4,5,7,8,11の最終結果になります。 、12]。
これも考慮してスクリプトを更新するにはどうすればよいですか? keys_listのすべての区切り文字パターンを特殊文字の正規表現コードに置き換えるステップがあるはずだと思いますか?
Re:部分文字列のリストを使用した列検索私はあなたが言うようにそれを正確に行うと思います。keys_listをループするか、「ワイルド」カード文字で入力します(正規表現の場合は機能するはずです)。 編集:を使用して。異なる文字が多すぎる可能性があるため、許可されているすべての文字列を含む文字列を作成することをお勧めします。 正規表現のもう1つのソースregex101
Names Default To Here(1);
keys_list = {"aaa", "aa bb"};
new_keys_list = Transform Each({new_key}, keys_list, Substitute(new_key, " ", "."));
dt = Current Data Table();
regex_pattern = "(" || Concat Items(new_keys_list, "|") || ")";
row_list = [];
For Each Row(dt,
If(!IsMissing(Regex(lowercase(:TEST), regex_pattern)),
Insert Into(row_list, Row())
);
);
show(row_list); //row_list = [1, 2, 4, 5, 7, 8, 11];
@vince_faller私はそれについて何かを見たことを覚えていると思いますが、少なくともJMP16では、IsMissing()が文字列で機能するのは、どちらの場合で、どの関数であるかはもうわかりません。 エラーがスローされるため、「a」==。のような比較を行った可能性があります。

Re:部分文字列のリストを使用した列検索ありがとう@jthi !
regex101素晴らしいリソースです!
Re:部分文字列のリストを使用した列検索列の数式で実行する場合
Names default to here(1);
dt = current data table();
dt << Add Rows({:Test = "aa-bb"});
dt << New Column("Match", Formula(isstring(Regex(:TEST, "(aaa)|(aa.bb)", "\0", IGNORECASE))));
dt << Run Formulas(); // just to make sure the formula runs
match_rows = loc(dt:Match << Get Values());
dt << Delete Columns(:Match);
show(match_rows); // match_rows = [1, 2, 4, 5, 7, 8, 11];
これが正規表現リソースよくわからない方が好きです。
また@jthi `ismissing()`は文字列の処理に使用されませんでしたか?私はそれが常に私の正規表現を殺していたことを覚えています(それで私がここで `isstring()`を使用した理由)。14.3までさかのぼって試してみましたが、問題ないようです。
*編集*はワイルドカードを作成しました。
Re:部分文字列のリストを使用した列検索これに対応するためにスクリプトを更新しました。これは単なる`.`ワイルドカードです。 ワイルドカードについてより具体的にしたいと思うかもしれません。通常、何でも許可するのは最善ではありません。特にそれがあなたが本当に望んでいるものではない場合。