搜索一列中的每个单元格以查找特定内容大家好,
我有一个 jmp 数据表,其中有一列每行包含不同的字符串。我想知道是否可以循环该列以查找该单元格中字符串的特定部分。
这是字符串的示例:
班级:10 表:15 统计:NA 位置:NA 教师:Sam --> 单元格内容
班级:11 桌子:11 统计:NA 地点:NA 老师:Sam
挑战是我有不同的班级#和不同的表#。但是,我只需要找到以“Class:#”开头的单元格,并将其余单元格放入列表中。
所以我的问题是:我可以在该特定列进行部分单元格搜索吗?
自动化和脚本编写基础数据分析和建模回复:搜索一列中的每个单元格以查找特定内容这是处理这个问题的一种可能的方法
Names Default To Here( 1 );
dt = Current Data Table();
foundList = {};
For Each Row(
If(
Word( 1, thestringcolumn, " " ) & Is Missing(
Num( word * 2, thestringcolumn, " " )
) == 0,
Insert Into(
foundList,
Substr(
thestringcolumn,
Length( Word( 1, thestringcolumn, " " ) )
+Length( Word( 2, thestringcolumn, " " ) ) + 2
)
)
)
);回复:搜索一列中的每个单元格以查找特定内容根据您的字符串格式,您可以使用重新编码(请注意,未选中“如果没有匹配则保留文本”)

或使用 For Each Row 的脚本。如果您使用 For Each Row,您有许多不同的选项来解析字符串以及如何存储结果,下面是另一个示例
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(2),
Compress File When Saved(1),
New Column("Column 1",
Character,
"Nominal",
Set Values(
{"Class: 10 Table:15 Stat:NA loc:NA teacher:Sam",
"Class: 11 Table:11 Stat:NA loc:NA teacher:Sam"}
)
)
);
result = {};
For Each Row(dt,
res = Regex(:Column 1, "^(Class: \d+) (.*)?", "\2");
If(!IsMissing(res),
Insert Into(result, res);
);
);
show(result);
// result = {"Table:15 Stat:NA loc:NA teacher:Sam", "Table:11 Stat:NA loc:NA teacher:Sam"};回复:搜索一列中的每个单元格以查找特定内容谢谢@jthi 。这非常适合我上面提供的示例。
我确实有一个后续问题,假设我们有以下字符串列表,
10::等级:A
11::类别:A1
12::等级:A2
..
20::B级
21::B1级
22::B1级
30::C级
31::C1级
32::C2 类
假设我想为每个班级列出一个清单。我希望第一个是 ClassAList = (11::Class: A ,11::Class: A ,11::Class: A );
我尝试修改 regex() 以查找字符串中的前导数字,然后将其移动到相应的列表中。我使用了这样的东西: Regex("10:::Class" , "[1]")
这里的问题是它正在寻找所有字符串中的 [1]。是否可以选择正则表达式应在其中查找匹配项的索引?
这里的另一个问题是只返回 1,而不是整个字符串。
任何指导表示赞赏。
回复:搜索一列中的每个单元格以查找特定内容这可能会让你知道你可以做什么
Names Default To Here(1);
mylist = {"10::Class: A", "11::Class: A1", "12::Class: A2", "20::Class B", "21::Class B1",
"22::Class B1", "30::Class C", "31::Class C1", "32::Class C2"};
class_pattern = "\d+::(Class:? [A-Z])";
aa = Associative Array();
For Each({myitem}, mylist,
res = Regex(myitem, class_pattern, "\1");
If(!Contains(aa, res),
aa[res] = {};
);
Insert Into(aa[res], myitem);
);
show(aa);
https://regex101.com/r/itqqww/1用于解释正则表达式模式
回复:搜索一列中的每个单元格以查找特定内容谢谢@jthi 。这非常有效。
跟进问题:
我想仅根据第一个数字将列表分组为子组。我尝试使用正则表达式锚来执行此操作。但是,它不是只匹配第一个数字,而是匹配第一个数字和后面的任何数字。任何指导表示赞赏。
回复:搜索某一列中的每个单元格以查找特定内容您指的是 B1 类部分吗?您可以通过在括号内添加 \d? 来修改正则表达式( https://regex101.com/r/Yfh6pZ/1)。\d将匹配数字,而 ? 将匹配其前面的标记零次或一次。如果您不想捕获没有数字的组,请省略 ? 或将其替换为 {1}

[
"Class B" => {"20::Class B"},
"Class B1" => {"21::Class B1", "22::Class B1"},
"Class C" => {"30::Class C"},
"Class C1" => {"31::Class C1"},
"Class C2" => {"32::Class C2"},
"Class: A" => {"10::Class: A"},
"Class: A1" => {"11::Class: A1"},
"Class: A2" => {"12::Class: A2"}
]