【发布时间】:2021-04-07 11:56:55
【问题描述】:
我认为这是一个简单的语法问题。我正在从字符串中提取关键字。关键字集在一个列中,源字符串在一个单独的列中。
我想要在结果列的头部使用单个 arrayformula 类型构造的相邻列中每个字符串的关键字结果。我对 QUERY、FILTER 或任何其他类型的动态数组公式持开放态度。
现实世界的电子表格有一个大小不定的测试字符串列,从零条目到大约 4000 个条目不等,具体取决于构建查询。关键字列也是动态的,当系统需要追加或删除关键字时会发生变化。它目前只有大约 60 行。每个字符串有四个结果的限制,匹配关键字没有特定的优先级,也没有限制它们出现的顺序。
关键字可以是任意数量的单词。所以“树”和“高树”将是两行。较长的关键字字符串始终优先。例如,字符串“我的花园里有一棵高大的树”的关键字结果将是“高大的树”而不是“树,高大的树”。
一个简短的例子: 我的关键字集(A 列 - 并在此处给出了“myWords”的命名范围):
ate
blue
cat
the cat
for
dead
bob
alive
我要测试的字符串(B 列):
Bob ate the dead cat
The cat ate live bob
No cat ate live dog
Bob is dead
Bob and the cat are alive
我的预期结果(C 栏):
Bob, Ate, Dead, Cat
The Cat, Ate, Bob
Cat, Ate
Bob, Dead
Bob, The Cat, Alive
示例电子表格是here。
如果我抄下以下公式,我会得到预期的结果。
=PROPER(TEXTJOIN(", ",TRUE,ArrayFormula(IFERROR(REGEXREPLACE($A2,REGEXREPLACE($A2,"(?i)("&TEXTJOIN("|",TRUE,myWords)&")","(.*)"),{"$1","$2","$3","$4"})))))
好结果,不需要的方法:
Bob, Ate, Dead, Cat
The Cat, Ate, Bob
Cat, Ate
Bob, Dead
Bob, The Cat, Alive
如果我构造一个数组公式版本,那么我会得到正确的结果,但都在第一行。
=arrayformula(PROPER(TEXTJOIN(", ",TRUE,IFERROR(REGEXREPLACE($A$2:$A$20,REGEXREPLACE($A$2:$A$20,"(?i)("&TEXTJOIN("|",TRUE,myWords)&")","(.*)"),{"$1","$2","$3","$4"})))))
不需要的结果,首选的方法类型:
Bob, Ate, Dead, Cat, The Cat, Ate, Bob, Cat, Ate, Bob, Dead, Bob, The Cat, Alive
我觉得答案会简单得令人尴尬 - 但我就是不明白!
2020 年 12 月 31 日更新
player0 下面的答案是完美的解决方案。已使用此答案更新了示例电子表格。
【问题讨论】:
标签: google-sheets array-formulas