提问人:DeeKay789 提问时间:11/16/2023 最后编辑:DeeKay789 更新时间:11/16/2023 访问量:47
使用 arrayformula 的 QUERY 字符串
QUERY strings using arrayformula
问:
我需要一个数组公式解决方案来确定我的搜索词所在的第一行号。我有一列字符串表示要搜索的数据(下面的 E 列),我有一列单字搜索词(下面的 A 列)。
A列 | E列 | |
---|---|---|
1 | 雨 | 全地形,无痛 |
2 | 太阳 | 有 2 很多, 雨, 在 西班牙 |
3 | 蓝 | 天空,是,蓝色的,在,星期天 |
4 | 紫色 | 云,这里是粉红色的 |
5 | 点 | 夜晚的红色黑子令人震惊 |
6 | 3 黄色,太阳斑 | |
7 | 紫雨 | |
8 | 3 | 雨点 |
9 | 5 | 583334378 |
我正在寻找的结果是:
A列 | B列 |
---|---|
雨 | 2 |
太阳 | 6 |
蓝 | 3 |
紫色 | 7 |
点 | 8 |
3 | 6 |
5 | 不 |
我尝试了各种不同的方法,但最成功的是下面的 QUERY 函数。
=if(A2<>"",iferror(query({arrayformula(row($E$2:$E)-1),$E$2:$E}, "select Col1 where Col2 matches '.*\b"&A2&"\b.*' limit 1"),"Nope"),)
我对 VLOOKUP 和 MATCH 的问题是,我找不到一个解决方案来提供字符串中部分匹配的索引,只有整个单元格匹配。
我还尝试过 TRANSPOSE/SPLIT 配对,但这似乎消除了我确定原始行的能力 - 这是我想要的位。不同工作表中的辅助列成倍地扩展了行数,我认为它破坏了工作表。每个字符串的总长度通常为 100+ 个字符(包括空格和标点符号,没有换行符)。
QUERY 解决方案的剩余问题是它只是一个“向下复制”解决方案,我需要数组公式版本。我试过了这个,但它没有遍历数组。
=ArrayFormula(if($A$2:$A<>"",iferror(query({arrayformula(row($E$2:$E)-1),$E$2:$E}, "select Col1 where Col2 matches '.*\b"&$A$2:$A&"\b.*' limit 1"),"Nope"),))
我从 Player0 尝试过这个,但它在我的示例表中提供了不完整的结果。我无法理解为什么当数据清楚地将其包含在其 REGEXEXTRACT 输出中时,它会错过 VLOOKUP 部分中的某些搜索词。我确实在这里使用了 G 中的辅助列,但它错过了我认为我不允许的工作表的最后一行(无法测试它)。 ...而且它似乎也挂着真实世界数据的床单。
={"ArrayFormula2"; ARRAYFORMULA(IFNA(VLOOKUP($A$2:$A,{REGEXEXTRACT(""&$F$2:$F, "\b"&TEXTJOIN("\b|\b", 1, $A$2:$A)&"\b"), $G$2:$G*1}, 2, 0)))}
对单单元格公式的要求是,这实际上是现有数组公式的第二部分。如果我的组合公式中的第一个表达式失败,那么我在这里学到的公式(希望)将被调用。在上面的第二个 QUERY 示例中,我通过一个简单的“如果不是空”测试模拟了通过/失败组件。
搜索词的数据集约为 25K-30K 行。字符串列大约为 5K 到 10K 行。这两个数组都是动态的,因为它们可以随时更改数据,并且可以添加或删除行 - 换句话说,如果没有手动交互,就无法确定行数 - 这是我渴望避免的。
答:
试试这个:
=arrayformula(LET(a,MAP($C$1:$C$9,LAMBDA(z,SUM(N(SPLIT(REGEXREPLACE(z, "_|,|;", " "), " ")=B1)))),MATCH(TRUE,a<>0,0)))
或溢出:
=arrayformula(map(B1:B9,lambda(x,(LET(a,MAP($C$1:$C$9,LAMBDA(z,SUM(N(SPLIT(REGEXREPLACE(z, "_|,|;", " "), " ")=x)))),MATCH(TRUE,a<>0,0))))))
结果:
用它包裹起来以消除错误。
请注意,行号是相对于数据集的。iferror
#N/A
评论
以下是您可以测试的一种方法:
=map(A2:A,lambda(Σ,if(Σ="",,ifna(+filter(row(F2:F)-1,--regexmatch(F2:F&"","\b"&Σ&""&"\b")=1),"Nope"))))
评论