使用部分字符串列表進行列搜索我正在嘗試從定義的部分字符串列表中獲取值匹配的行。 下面的例子。
我感興趣的部分字符串是“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>腳本回复:使用部分字符串列表進行列搜索我很可能會在這裡使用常規的正則表達式。 如果它變得太慢,那麼我可能會開始考慮更複雜的事情
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];回复:使用部分字符串列表進行列搜索這是我解決此問題的方法
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));回复:使用部分字符串列表進行列搜索@jthi , @txnelson , @vince_faller感謝您的解決方案! 我實際上忘了提及另外一種情況。 keys_list 中的第二個元素是“aa bb”,它是用空格分隔符分隔的兩個單詞。 在我正在處理的數據集中,可能存在分隔符是其他一些特殊字符的情況。 例如,如果第 12 行的值為“aa-bb”,我希望也調用該行,這導致最終結果為 [1,2,4,5,7,8,11 ,12]。
我應該如何更新腳本來解決這個問題? 我猜應該有一個步驟用特殊字符的正則表達式代碼替換 keys_list 中的所有分隔符模式?
回复:使用部分字符串列表進行列搜索我想我會完全按照你說的去做,要么循環遍歷 keys_list ,要么只是用“通配符”卡字符在其中輸入它們(如果是正則表達式 . 應該可以工作)。 編輯:使用 .可能匹配j太多不同的字符,所以最好最有可能構建一個包含所有允許字符串的字符串. 正則表達式的另一個來源正則表達式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" == . 這樣的比較,因為它會拋出錯誤:

回复:使用部分字符串列表進行列搜索謝謝@jthi !
正則表達式101是一個很棒的資源!
回复:使用部分字符串列表進行列搜索如果您想在列公式中執行此操作
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,但似乎還不錯。
*Edit* 製作了通配符。
回复:使用部分字符串列表進行列搜索我更新了我的腳本以適應這一點。它只是一個 `.` 通配符。 您可能希望更具體地了解您的通配符。允許任何事情通常不是最好的。特別是如果那不是你真正想要的。