使用部分字符串列表进行列搜索我正在尝试从定义的部分字符串列表中获取值匹配的行。 下面的例子。
我感兴趣的部分字符串是“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 ,要么只是用“通配符”卡字符在其中输入它们(如果是正则表达式 . 应该可以工作)。 编辑:使用 .可能会匹配太多不同的字符,因此最好构建一个包含所有允许字符串的字符串. 正则表达式的另一个来源正则表达式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* 制作了通配符。
回复:使用部分字符串列表进行列搜索我更新了我的脚本以适应这一点。它只是一个 `.` 通配符。 您可能希望更具体地了解您的通配符。允许任何事情通常不是最好的。特别是如果那不是你真正想要的。