部分文字列のリストによる列検索部分文字列の定義されたリストから値が一致する行を取得しようとしています。 以下の例。
私が興味のある部分文字列は、「aaa」または「aa bb」のいずれかです。 以下の 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: 部分文字列のリストを使った列検索これに対応するためにスクリプトを更新しました。これは単なる「.」ワイルドカードです。 ワイルドカードをより具体的に指定する必要があるかもしれません。通常、何でも許可するのは最善ではありません。特にそれがあなたが本当に望んでいることではない場合。
Re: 部分文字列のリストを使った列検索ありがとう@jthi !
正規表現101素晴らしいリソースです!
Re: 部分文字列のリストを使った列検索あなたが言ったとおりに、keys_listをループするか、単に「ワイルド」カード文字を使用してそこに入力すると思います(正規表現の場合、 . は機能するはずです)。 編集: を使用して。異なる文字が多すぎる可能性があるため、許可されているすべての文字列を含む文字列を構築することをお勧めします。 。 正規表現のもう 1 つのソース正規表現101
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 、 @txnelson 、 @vince_faller解決策をありがとう! 実はもう 1 つのシナリオについて言及するのを忘れていました。 key_list の 2 番目の要素は「aa bb」で、スペース区切り文字で区切られた 2 つの単語です。 私が取り組んでいるデータセットでは、区切り文字が他の特殊文字である場合があります。 たとえば、値が「aa-bb」の 12 行目がある場合、その行も呼び出すと、最終結果は [1,2,4,5,7,8,11] になります。 ,12]。
これを考慮してスクリプトを更新するにはどうすればよいですか? キーリスト内のすべての区切り文字パターンを特殊文字の正規表現コードに置き換えるステップがあるはずだと思いますか?
Re: 部分文字列のリストを使った列検索@jthi 、 @txnelson 、 @vince_faller解決策をありがとう!
実はもう 1 つのシナリオについて言及するのを忘れていました。 key_list の 2 番目の要素は「aa bb」で、スペース区切り文字で区切られた 2 つの単語です。 私が取り組んでいるデータセットでは、区切り文字が他の特殊文字である場合があります。 たとえば、値が「aa-bb」の 12 行目がある場合、その行も呼び出すと、最終結果は [1,2,4,5,7,8,11] になります。 ,12]。
これを考慮してスクリプトを更新するにはどうすればよいですか? キーリスト内のすべての区切り文字パターンを特殊文字の正規表現コードに置き換えるステップがあるはずだと思いますか?
Re: 部分文字列のリストを使った列検索@jthi 、 @vince_faller 、 @txnelson 。 ありがとう! これらは素晴らしい解決策です。
実は、作業中のデータに含まれる可能性のあるもう 1 つのシナリオを含めるのを忘れていました。 key_list の 2 番目の項目は「aa bb」で、スペース区切り文字で区切られた 2 つの単語です。 私のデータセットでは、単語が他の特殊文字で区切られている場合がありますが、それでもそれらを含めたいと考えています。 たとえば、値が「aa-bb」の 12 行目がある場合、それも呼び出す必要があるため、最終的な結果は [1,2,4,5,7,8,11,12] になります。 】
これに対応するためにスクリプトを更新するにはどうすればよいでしょうか? 正規表現によってパターンで認識できる特殊文字の特別なコードでkeys_list内のすべての区切り文字を置き換えるステップがあると思いますか?
助けてくれてありがとう!
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: 部分文字列のリストを使った列検索この問題を解決するための私のアプローチは次のとおりです
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: 部分文字列のリストを使った列検索ここではおそらく、このようなもので通常の正規表現を使用するでしょう。 それが遅すぎる場合は、もっと複雑なことを考え始めるかもしれません
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];