如何在Excel中反向逗号分隔的字符串?

时间:2019-02-15 20:27:04

标签: excel excel-formula

如何在MS Excel中使用公式来反转逗号分隔的行?值的数量并不总是相同的,因此某些行包含3、4,只有一些元素。

所以输出看起来像下面的图像

enter image description here

3 个答案:

答案 0 :(得分:5)

如果您具有Office 365 Excel,则使用此数组公式:

=TEXTJOIN(",",,TRIM(MID(SUBSTITUTE(A2,",",REPT(" ",99)),((LEN(A2)-LEN(SUBSTITUTE(A2,",",""))+1)-ROW($XFD$1:INDEX(XFD:XFD,LEN(A2)-LEN(SUBSTITUTE(A2,",",""))+1)))*99+1,99)))

作为数组公式,退出编辑模式时需要使用Ctrl-Shift-Enter而不是Enter进行确认。

如果没有Office 365 Excel,则可能只有vba。

enter image description here

答案 1 :(得分:3)

草率的UDF解决方案:

Function REVERSESTRING(original As Range, delim As String)

    Dim i As Long, reversed As String, arr As Variant

    arr = Split(original.Value, delim)

    For i = UBound(arr) To 0 Step -1
        reversed = reversed & arr(i) & ","
    Next i

    REVERSESTRING = Left(reversed, Len(reversed) - 1)

End Function

img1

答案 2 :(得分:0)

单单元格公式适用于Excel 365;使用该版本不需要特殊的数组计算条目、VBscripts 或辅助列:

Three-column excel table, showing a comma-separated list being reversed


程序

在Excel中制作下表: enter image description here

  1. 添加列标题

  2. 选择标题,然后按插入功能区选项卡上的表格图标

  3. 将下面的公式 1 和 2 复制到相应的列中

    
    Original |  #  |  Reversed
    ---------+-----+-----------
             | {1} |       {2}
    
  4. 将要反转的字符串放在第一列中。


细节和定制

'原始'栏

(保存要处理的分隔字符串值)

将您的源数据放在此列中(如示例图片所示)

'#' 列

(计算分隔单元格中的项目数)

注意:(此列完全可选;它仅显示原始列中的项目数)

{1} <- 替换为公式 #1:

=LET(
    existingDelimiter, ","
    , originalValue,   [@[Original]]
    , SUM(
        LEN(originalValue) 
        - LEN(
            SUBSTITUTE(
                originalValue
                , existingDelimiter
                , ""
            )
        )
    )
    +1
)

(注意:如果您的列表使用分隔符而不是逗号,或者如果您的表格的第一列将具有不同的名称,请使用为 下面的公式#2。)

“反转”列

(反转列表中分隔项的顺序;可选择更改分隔符)

{2} <- 替换为公式 #2:

=LET(
    existingDelimiter, ","
    , newDelimiter,    ","
    , originalValue,   [@[Original]]
    , SUBSTITUTE(
        ARRAYTOTEXT(
            LET(
                list,
                    IFERROR(
                        FILTERXML(
                            "<t><s>"
                                & SUBSTITUTE(
                                    originalValue
                                    ,existingDelimiter
                                    ,"</s><s>"
                                )
                                & "</s></t>"
                            , "//s"
                        )
                        ,""
                    )
                ,SORTBY(
                    list,
                    SEQUENCE(
                        ROWS(list)
                        ,1
                        ,ROWS(list)
                        ,-1
                    )
                )
            )
            ,0
        )
        , ", "
        , newDelimiter
    )
)
  1. 根据需要通过更改 existingDelimiternewDelimiteroriginalValue 的值来调整您想要完成的公式。

    A.要反转逗号分隔的字符串,请使用以下公式:

       existingDelimiter, ","
       , newDelimiter,    ","
    
    1. 示例: Three-column excel table, showing a comma-separated list being reversed

    B.要反转 DNS 名称,请将 existingDelimiternewDelimiter 的定义中的逗号替换为句点:

       existingDelimiter, "."
       , newDelimiter,    "."
    
    1. 这对于 reverse DNS names(又名 Java 类名/Universal Type Indicators (UTIs) / 等)非常有用
    2. 示例: Three-column excel table, showing a period-separated list being reversed
  2. [@[Original]] 中的“Original”替换为您第一列的名称(如果不同)。

    A.如果仅使用单个单元格而不是表格列作为输入,请将 [@[Original]] 替换为对该单元格的引用(例如 B2):

      , originalValue,   B2
    1. 示例:

      two spreadsheet cells, the first showing the list 'a,b,c,d' and the second showing the list 'd,c,b,a'

“反转”列公式说明:
  1. 通过手动转换为 XML,我们可以使用 FilterXML 函数,该函数将数据转换为数组
  2. 将数据放在数组中允许使用SortBy函数。
  3. SortBy 使用由 Sequence 函数创建的辅助 array 来反转 array
  4. 最后,ArrayToText 函数将这个(现在是反向排序的)array 转换回适合单个电子表格单元格的文本字符串。

这使我们不需要循环、辅助列或 VBScript。


奖金栏

要从列表中提取特定术语,请在另一个表格列中使用以下公式:

  1. (将termNumber中的数字改成想要的值):

    =LET(
        existingDelimiter, ","
        , originalValue,   [@[Original]]
        , termNumber,      "[2]"
        , IFERROR(
            FILTERXML(
                "<t><s>"
            & SUBSTITUTE(
                originalValue
                , existingDelimiter
                , "</s><s>"
            )
            & "</s></t>"
            , "//s"
                & termNumber
            )
            , ""
        )
    )
    
  2. 示例:

    Three-column excel table (same as above), showing a comma-separated list being reversed, but with a fourth column added that shows the second part of the value in the first column


其他注意事项

需要:

  • Excel 365(至少用于 FilterXMLLet 函数,以及动态数组)(*)
    • 它可能适用于其他版本,但我还没有测试过。如果您发现其他或未来版本(例如 Excel 2022)与此兼容,请在评论中注明。

不需要

  • 动态数组入口
  • VB 脚本
  • 启用宏的文件

(*) 这可以在 没有Let 函数的情况下完成,但是使用 Let 可以减少编辑/重新调整计算的机会用户错误。

注意:当 Lambda 函数发布时(希望在 2021 年晚些时候) 那么这一切都可以包含在一个命名的工作表函数中

奖励:要编辑更复杂的 Excel 公式并突出显示代码(以及其他功能,例如自动意图和折叠),请尝试使用带有 {{3} } 编程语言支持。示例:

  1. Swift (免费;跨平台)

    • 在有 Excel 特定的扩展可用之前,安装一个 Swift VSCode 扩展,例如:VSCode editor(它似乎可以很好地提供代码突出显示和折叠)立>
  2. Swift language VSCode extension (免费;仅限 Windows)

    • 从“语言”菜单中选择“Swift”

灵感来自(如果我忘记了某人,请道歉)