使用部分字串列表進行列搜索我試圖從定義的部分字串列表中獲取值與匹配的行。 下面的例子。
我感興趣的部分字串是“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>自動化和腳本編寫回覆:使用部分字串清單進行列搜索我更新了我的腳本以適應這一點。這只是一個“.”通配符。 您可能想要更具體地說明您的通配符。允許任何事情通常都不是最好的。特別是如果這不是您真正想要的。
回覆:使用部分字串清單進行列搜索謝謝@jthi !
正規表示式101是一個很棒的資源!
回覆:使用部分字串清單進行列搜索我想我會完全按照你說的那樣做,要么循環keys_list,要么只是用“通配”卡字符輸入它們(如果是正則表達式 . 應該可以工作)。 編輯:使用 .可能會匹配太多不同的字符,因此最好建立一個包含所有允許的字串的字串。 正規表示式的另一個來源正規表示式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 , @tx尼爾森, @vince_faller感謝您的解決方案! 我實際上忘記提及另一種情況。 keys_list 中的第二個元素是“aa bb”,它是用空格分隔符號分隔的兩個單字。 在我正在處理的資料集中,可能存在分隔符號是其他特殊字元的情況。 例如,如果第 12 行的值為“aa-bb”,我希望該行也被調用,這會導致最終結果 [1,2,4,5,7,8,11 ,12]。
我應該如何更新腳本來解決這個問題? 我猜應該有一個步驟用特殊字元的正規表示式程式碼替換keys_list中的所有分隔符號模式?
回覆:使用部分字串清單進行列搜索@jthi , @tx尼爾森, @vince_faller感謝您的解決方案!
我實際上忘記提及另一種情況。 keys_list 中的第二個元素是“aa bb”,它是用空格分隔符號分隔的兩個單字。 在我正在處理的資料集中,可能存在分隔符號是其他一些特殊字元的情況。 例如,如果第 12 行的值為“aa-bb”,我希望該行也被調用,這會導致最終結果 [1,2,4,5,7,8,11 ,12]。
我應該如何更新腳本來解決這個問題? 我猜應該有一個步驟用特殊字元的正規表示式程式碼替換keys_list中的所有分隔符號模式?
回覆:使用部分字串清單進行列搜索@jthi , @vince_faller , @tx尼爾森。 謝謝! 這些都是很好的解決方案!
實際上,我忘記包括我可能在正在處理的數據中看到的另一種情況。 key_list 中的第二項是“aa bb”,它是由空格分隔符號分隔的兩個單字。 在我的資料集中,可能存在單字與其他特殊字元分隔的情況,但我仍然希望將它們包含在內。 例如,如果第 12 行的值為“aa-bb”,我希望也將其調出,因此最終結果將是 [1,2,4,5,7,8,11,12 ]
您將如何更新腳本來適應這種情況? 我猜有一個步驟,將keys_list中的所有分隔符號替換為特殊字元的特殊程式碼,這些特殊字元可以透過正規表示式在模式中識別?
謝謝您的幫忙!
回覆:使用部分字串清單進行列搜索如果您想在列公式中執行此操作
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,但似乎沒問題。
*編輯*製作了通配符。
回覆:使用部分字串清單進行列搜索這是我解決這個問題的方法
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));回覆:使用部分字串清單進行列搜索我很可能會在這裡使用常規正則表達式和類似的東西。 如果它變得太慢,那麼我可能會開始考慮一些更複雜的事情
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];