使用部分字符串列表进行列搜索我试图从定义的部分字符串列表中获取值与匹配的行。 下面的例子。
我感兴趣的部分字符串是“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];