有没有一种方法可以计算字符串中每个单词的字符数,并返回以逗号分隔的值?

Is there a way to count the number of characters per word for a string, returning values separated by a comma?

我在单元格中有一个字符串列表 - 其中有 1000 个 - 我需要计算每个单词的字符但按单词分隔 - 最好在 1 swift 公式中...

例如: 1. "Black Cup With Handle" > 我需要的公式 > 5,3,4,6

  1. "Giant Bear Statue" > 我需要的公式 > 5,4,6

我需要这个用于重复性任务,该任务以一种非常低效的方式进行了宏化,以将单词计入列(其中我们最多需要使用 20 个来进行封装),但这需要解决。

通常,我们计算空格和层嵌套的 serach() 公式以搭载一个和另一个分解结构然后字符计算单个单词...

我也可以用宏来代替逗号的空格,并将文本用于列,但这仍然让我需要很长的时间来计算我正在寻找的内容

我们明明用=LEN(A1)-LEN(SUBSTITUTE(A1," ",""))来统计单词中的空格

我们目前使用 =SEACRH() 函数结合 =MID() 函数(和一些奇怪的数字)将每个单词显示在它自己的单元格中

然后 =LEN 再次针对所有单个单词 - 非常冗长

我希望找到一个更短的方法来做到这一点,但感觉可能没有足够动态的方法来单独使用公式,希望有人能证明我错了!

我不太清楚您要寻找的最终结果是什么,或者您是否接受 VBA 解决方案,但这是我的解释:

Function lengths(txt As String) As String
  Dim wrd
  For Each wrd In Split(txt)
    If lengths <> "" Then lengths = lengths & ","
    lengths = lengths & Len(wrd)
  Next wrd
End Function

将代码粘贴到 VBA 模块中,然后,例如,如果 A1 包含 Black Cup With Handle,那么在另一个单元格中您可以使用 =length(A1),这将 return 5,3,4,6.

如果您想使用 VBA 代码,您可以试试这个:

Option Explicit

Sub test()

    Dim arr As Variant
    Dim str As String
    Dim i As Long, j As Long, LastRow As Long

    With ThisWorkbook.Worksheets("Sheet1")

        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        For i = 1 To LastRow

            str = .Range("A" & i).Value

            arr = Split(str, " ")

            For j = LBound(arr) To UBound(arr)
                .Cells(i, j + 3).Value = Len(arr(j))
            Next j

        Next i

    End With

End Sub

结果:

根据您的 Excel 版本,您将有不同的选择。


选项 1:TEXTJOIN

我认为您正在寻找 TEXTJOIN 函数。请记住,您只能在 Excel 的更高版本中使用它(请参阅 link 文档)并且它可以像这样工作:

B1中的公式:

=TEXTJOIN(",",TRUE,LEN(FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s")))

NOTE: It's an array formula and you need to enter it using CtrlShiftEnter

为了让您不需要使用上面的组合键,我们可以包含一个 INDEX:

=TEXTJOIN(",",TRUE,INDEX(LEN(FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s")),))

附加信息:

FILTERXML

此函数采用(根据文档)两个必需的参数:

  • 字符串有效XML
  • 字符串有效XPath

因为我们想要 return 来自单元格的元素(单词)数组,我们需要 SUBSTITUTE 结束标记的 spaces (</..> ) 并将其与字符串开头的开始标记 (<..>) 和末尾的另一个结束标记连接起来。

我将不得不依靠 XML 对标签的解释来解释为什么 <?><?> 起作用及其含义,因为就我的测试而言,我可以交换字母或替换只要最后的 Xpath 类似于相同的字符,就可以用另一个具有相同结果的字母。如果有人能够通过更好的解释来补充这个答案,那就太好了。

更多FILTERXML"tricks",看看


TEXTJOIN

如果您是 Office 365 订阅者或拥有 Excel 2019,则可以使用此功能。至少有 3 个必需参数(根据文档):

  • 一个分隔符,它必须是一个文本字符串,或者为空,或者用双引号括起来的一个或多个字符,或者是对有效文本字符串的引用。如果提供了数字,它将被视为文本。
  • 第二个参数可以包含 TRUEFALSE 并确定您是否要 exclude/include 空值
  • 第三个参数是要连接的文本项。文本字符串或字符串数​​组,例如单元格区域。

现在这是我们可以将两个函数连接在一起的地方,FILTERXML return我们可以在 TEXTJOIN.

中使用一个数组

INDEX + LEN

这几个函数的用法我得一并说明。我认为 LENINDEX 本身不需要太多介绍,但它们一起工作得很好。当您将值数组传递给函数时,本机将存在一种称为隐式交集的力量,它会阻止 LEN 从 return 获取值数组,在本例中是通过我们的 FILTERXML

通常您会使用以下组合键禁用此机制:CtrlShiftEnter ,更广为人知的是 CSE

现在 INDEX 所做的是禁用此隐式交集,使 LEN 能够 return 一个数组,从而无需 CSE 公式。 INDEX 是具有此 "power" 的函数之一。可以找到关于隐式交集的更深入的解释


选项 2:UDF

无法访问 TEXTJOIN 我认为您需要了解一下使用 UDF,可能如下所示:

Function TEXTJOIN(rng As Range) As String
    TEXTJOIN = Join(Application.Evaluate("LEN({""" & Join(Split(rng, " "), """,""") & """})"), ",")
End Function

您可以在 B1 中这样调用它:=TEXTJOIN(A1)


附加信息:

UDF 由三个协同工作的主要机制组成:

JOIN

此函数有两个参数,其中第一个参数是必需的:

  • 第一个参数是一个包含子字符串的一维数组
  • 第二个(可选)参数是一个字符串字符,用于分隔 returned 字符串中的子字符串。如果省略,则使用 space 字符 (" ")。如果定界符是零长度字符串 (""),则列表中的所有项目都没有定界符连接。

函数return是一个字符串值


SPLIT

此函数接受一个字符串并用指定的 character/substring 分隔它。它采用以下参数:

  • 1st:包含子字符串和定界符的必需字符串表达式。如果expression是一个零长度的字符串(""),拆分returns一个空数组,即没有元素也没有数据的数组。
  • 2nd: 可选的分隔符,它是一个字符串字符,用于标识子字符串限制。如果省略,则假定 space 字符 (" ") 为定界符。如果 delimiter 是零长度字符串,则包含整个表达式字符串的单元素数组是 returned.
  • 3rd:一个可选的限制,要return编辑的子字符串的数量; -1 表示所有子串都是returned.
  • 4th:Compare,也是可选的,是一个数值,指示在评估子字符串时使用的比较类型。有关值,请参阅设置部分。

在这种情况下,我们只需要前两个参数。


Application.Evaluate

这是 IMO 最方便的机制之一,您可以使用它来提取 returned 值数组,而无需循环遍历 items/cells。当您为函数提供大型数组公式时,它可能会变慢,但在这种情况下会很好。该函数将 Microsoft Excel 名称转换为对象或值,当我们将公式传递给它时,它将 return 结果。在这种特殊情况下,它将 return 一个数组。