在 Arrayformula 中提取行
Extracting rows in Arrayformula
我认为这是一个简单的语法问题。我正在从字符串中提取关键字。关键字集在一列中,源字符串在单独的列中。
我希望相邻列中每个字符串的关键字结果在结果列的头部使用单个 arrayformula 类型构造。我愿意使用 QUERY、FILTER 或任何其他类型的动态数组公式。
现实世界的电子表格有一个不确定大小的测试字符串列,范围从零个条目到大约 4000 个,具体取决于构建查询。关键字列也是动态的,当系统需要添加或删除关键字时会发生变化。目前只有大约 60 行。每个字符串有四个结果的限制,匹配关键字没有特定的优先级,并且对它们出现的顺序没有限制。
关键字可以是任意数量的单词。所以‘Tree’和‘Tall Tree’将是两行。较长的关键字字符串始终优先。例如,字符串“I have a tall tree in my garden”的关键字结果将是“Tall Tree”而不是“Tree, Tall Tree”。
一个简短的例子:
我的关键字集(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)&")","(.*)"),{"","","",""})))))
好的结果,不需要的方法:
Bob, Ate, Dead, Cat
The Cat, Ate, Bob
Cat, Ate
Bob, Dead
Bob, The Cat, Alive
如果我构造一个 arrayformula 版本,那么我会得到正确的结果,但都在第一行。
=arrayformula(PROPER(TEXTJOIN(", ",TRUE,IFERROR(REGEXREPLACE($A:$A,REGEXREPLACE($A:$A,"(?i)("&TEXTJOIN("|",TRUE,myWords)&")","(.*)"),{"","","",""})))))
不需要的结果,首选方法类型:
Bob, Ate, Dead, Cat, The Cat, Ate, Bob, Cat, Ate, Bob, Dead, Bob, The Cat, Alive
我觉得答案会简单得令人尴尬 - 但我就是做不到!
2020 年 12 月 31 日更新
下面player0
的回答是完美的解决方案。示例电子表格已使用此答案更新。
使用:
=ARRAYFORMULA(REGEXREPLACE(TRIM(FLATTEN(QUERY(TRANSPOSE(
PROPER(IFERROR(REGEXREPLACE(B2:B14, REGEXREPLACE(B2:B14, "(?i)("&
TEXTJOIN("|", 1, myWords)&")", "(.*)"),
{",", ",", ",", ","})))),,9^9))), ",$", ))
更新:
=ARRAYFORMULA(REGEXREPLACE(TRIM(FLATTEN(QUERY(TRANSPOSE(
PROPER(IFERROR(REGEXREPLACE(REGEXREPLACE(B2:B14, "\+", "♂"),
REGEXREPLACE(REGEXREPLACE(B2:B14, "\+", "♂"), "(?i)("&
TEXTJOIN("|", 1, Answer!myWords)&")", "(.*)"),
{",", ",", ",", ","})))),,9^9))), ",$", ))
我认为这是一个简单的语法问题。我正在从字符串中提取关键字。关键字集在一列中,源字符串在单独的列中。
我希望相邻列中每个字符串的关键字结果在结果列的头部使用单个 arrayformula 类型构造。我愿意使用 QUERY、FILTER 或任何其他类型的动态数组公式。
现实世界的电子表格有一个不确定大小的测试字符串列,范围从零个条目到大约 4000 个,具体取决于构建查询。关键字列也是动态的,当系统需要添加或删除关键字时会发生变化。目前只有大约 60 行。每个字符串有四个结果的限制,匹配关键字没有特定的优先级,并且对它们出现的顺序没有限制。
关键字可以是任意数量的单词。所以‘Tree’和‘Tall Tree’将是两行。较长的关键字字符串始终优先。例如,字符串“I have a tall tree in my garden”的关键字结果将是“Tall Tree”而不是“Tree, Tall Tree”。
一个简短的例子: 我的关键字集(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)&")","(.*)"),{"","","",""})))))
好的结果,不需要的方法:
Bob, Ate, Dead, Cat
The Cat, Ate, Bob
Cat, Ate
Bob, Dead
Bob, The Cat, Alive
如果我构造一个 arrayformula 版本,那么我会得到正确的结果,但都在第一行。
=arrayformula(PROPER(TEXTJOIN(", ",TRUE,IFERROR(REGEXREPLACE($A:$A,REGEXREPLACE($A:$A,"(?i)("&TEXTJOIN("|",TRUE,myWords)&")","(.*)"),{"","","",""})))))
不需要的结果,首选方法类型:
Bob, Ate, Dead, Cat, The Cat, Ate, Bob, Cat, Ate, Bob, Dead, Bob, The Cat, Alive
我觉得答案会简单得令人尴尬 - 但我就是做不到!
2020 年 12 月 31 日更新
下面player0
的回答是完美的解决方案。示例电子表格已使用此答案更新。
使用:
=ARRAYFORMULA(REGEXREPLACE(TRIM(FLATTEN(QUERY(TRANSPOSE(
PROPER(IFERROR(REGEXREPLACE(B2:B14, REGEXREPLACE(B2:B14, "(?i)("&
TEXTJOIN("|", 1, myWords)&")", "(.*)"),
{",", ",", ",", ","})))),,9^9))), ",$", ))
更新:
=ARRAYFORMULA(REGEXREPLACE(TRIM(FLATTEN(QUERY(TRANSPOSE(
PROPER(IFERROR(REGEXREPLACE(REGEXREPLACE(B2:B14, "\+", "♂"),
REGEXREPLACE(REGEXREPLACE(B2:B14, "\+", "♂"), "(?i)("&
TEXTJOIN("|", 1, Answer!myWords)&")", "(.*)"),
{",", ",", ",", ","})))),,9^9))), ",$", ))