使用 arrayformula 的 QUERY 字符串

QUERY strings using arrayformula

提问人:DeeKay789 提问时间:11/16/2023 最后编辑:DeeKay789 更新时间:11/16/2023 访问量:47

问:

我需要一个数组公式解决方案来确定我的搜索词所在的第一行号。我有一列字符串表示要搜索的数据(下面的 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 行。这两个数组都是动态的,因为它们可以随时更改数据,并且可以添加或删除行 - 换句话说,如果没有手动交互,就无法确定行数 - 这是我渴望避免的。

表格 google-sheets -公式

评论

0赞 DeeKay789 11/17/2023
如果有任何版主过来...鉴于下面的答案,我的标题现在可能不是其他人找到解决方案的最佳描述。请提出建议。
1赞 MattKing 11/17/2023
在什么情况下会想要返回“行”号?这通常是 XY 问题的中间步骤?
0赞 DeeKay789 11/17/2023
当需要验证正确的行引用时,当它成为另一个引用的参数时,将从另一个工作表中提取正确的数据。任何比这更广泛的解释都会变成对我作为来源的数据结构的独白。我认为不适合这里。
0赞 MattKing 11/17/2023
但是你不需要使用行号作为另一个工作表中另一个引用的参数,你可以提取你需要的数据,但我理解你在说什么不想对结构咆哮。我只想说你似乎遇到了 XY 问题。

答:

0赞 user11222393 11/16/2023 #1

试试这个:

=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))))))

结果:

enter image description here

用它包裹起来以消除错误。 请注意,行号是相对于数据集的。iferror#N/A

评论

1赞 DeeKay789 11/17/2023
:-)谢谢 - 我第一次使用嵌套的 LAMBDA 函数。我调整了溢出选项以适应数据,现在这完全复制了它(对于那些可能正在关注的人)。当我在真实世界的数据集上测试了所有类型的响应时,我会勾选正确答案。=arrayformula(if($A$2:$A<>“”,iferror(map($A$2:$A,lambda(x,(LET(a,MAP($F$2:$F,LAMBDA(z,SUM(N(SPLIT(REGEXREPLACE(z, “_|,|;”, “ ”), “ ”)=x)))),MATCH(TRUE,a<>0,0))))),“Nope”),))
1赞 rockinfreakshow 11/16/2023 #2

以下是您可以测试的一种方法:

=map(A2:A,lambda(Σ,if(Σ="",,ifna(+filter(row(F2:F)-1,--regexmatch(F2:F&"","\b"&Σ&""&"\b")=1),"Nope"))))

enter image description here

评论

0赞 DeeKay789 11/17/2023
谢谢。这是开箱即用的。当我在真实世界的数据集上测试了所有类型的响应时,我会勾选正确答案 - 可能需要我一天左右的时间,但 TIA
0赞 DeeKay789 11/17/2023
我正在(慢慢地)研究你的逻辑。你介意为我澄清几点吗?1. REGEXMATCH 自然返回 TRUE 或 FALSE。通过使用“--”前缀并似乎用“=1”后缀将布尔输出加倍来强制布尔输出的原因是什么?它显然有效 - 但删除它们似乎也是如此。2. 我找不到关于为什么在 FILTER 中添加“+”前缀会强制输出单个值的参考。您知道此功能的解释记录在哪里吗?再次感谢。