【问题标题】:Specific concatenation of text cells by formula通过公式特定连接文本单元格
【发布时间】:2014-09-17 03:23:03
【问题描述】:

我很难生成以我想要的方式组合文本单元格的CONCATENATE 公式。我要连接五个字段:Title、Forename、RegnalNumber、Surname 和 Alias,按此顺序。我不是正则表达式专家,所以请原谅糟糕的格式,但这是表达我想要实现的目标的粗略方式:

(title)? (forename) (regnalnumber)? (surname)?, (alias).

唯一不能为空的字段是名字字段,尽管它可能具有值“?”,在这种情况下,它不应该在连接中输出任何内容,即它应该被视为空白。希望以下测试用例能够展示我想要实现的输出:右侧的输出应该是这样的:

| Title  | Forename | RN | Surname   | Alias        | CONCATENATE                           |
+--------+----------+----+-----------+--------------+---------------------------------------+
| Ser    | Jaime    |    | Lannister | Kingslayer   | Ser Jaime Lannister, Kingslayer       |
|        | Pate     |    |           |              | Pate                                  |
| Lord   | ?        |    | Vance     |              | Lord Vance                            |
| King   | Aerys    | II | Targaryen | The Mad King | King Aerys II Targaryen, The Mad King |
| Lord   | Jon      |    | Arryn     |              | Lord Jon Arryn                        |
|        | Garth    |    |           | Of Oldtown   | Garth, Of Oldtown                     |

我已经尝试了很长时间来尝试使这种串联工作,但一直无法做到正确。这是当前的公式,为便于理解,将单元格引用替换为字段名称:

=CONCATENATE(IF(Title<>"",Title&" ",""),IF(AND(Forename<>"",Forename<>"?"),Forename,""),IF(RN<>""," "&RN,""), IF(OR(AND(Forename<>"", Forename<>"?"), Surname<>"", RN<>""), " ",""), IF(Surname<>"",Surname,""),IF(AND(Alias<>"",OR(Alias<>"",AND(Forename<>"", Forename<>"?"),Surname<>"")),", "&Alias, Alias))

有一种情况不起作用:如果 Surname 和 RN 为 null,但 Forename 和 Alias 为非 null。例如,如果 Forename 是 Garth,Alias 是 Of Oldtown,则串联输出:Garth , Of Oldtown。如果标题不为空,则相同。逗号前不能有空格。

你能帮我修正这个公式,让它按预期工作吗?如果你能找到一种方法来简化它,那就更好了!我知道我可能把这件事复杂化了很多。我使用的是 LibreOffice Calc 4.3.1.2,而不是 Excel。

【问题讨论】:

    标签: excel-formula concatenation libreoffice-calc


    【解决方案1】:

    恕我直言,解决此类情况的最佳方法是将问题划分为多个简单列,而不是 1 个巨大的复杂公式。请记住,您始终可以隐藏不想看到的列。

    所以为标题创建一个列=if(a2="","",a2&amp;" ")。

    这可以扩展到所有其他列,除了:

    • 对于 Forename,您希望在其中包含“?”如下:=if(b2="?","",b2&amp;" ")
    • 对于要包括前导“,”的别名:=if(e2="","",", "&amp;e2)

    最后,只需将每个工作列与以下内容连接起来:=f2&amp;g2&amp;h2&amp;i2&amp;j2。

    这将问题分解为非常简单的组件,并使其易于调试。如果您想在以后添加额外的功能,可以很容易地将其中一个公式换成其他公式。

    【讨论】:

    • 顺便问一下,你有什么理由测试单元格为空,而不是不为空,还是个人喜好?
    • 太好了,我使用了你的方法并成功地提出了一个适合所有测试用例的 concat。感谢您的帮助。
    • @LeoKing 原因我“测试单元格为空” - 个人偏好:1)少输入,2)测试“?”看起来非常相似,3) 猜猜用各种语言编码的时间只是几年。
    • @LeoKing 关于使用不同的列 - 我无法强调这对现实世界有多大帮助。不需要使用长公式,这更容易测试、调试、改进等。
    【解决方案2】:

    我知道这只是有点有趣,但我可以建议一种更算法的方法吗?

    算法是:-

    If a field is empty or ?, do nothing
    
    Else
    
      If concatenation so far is empty, add field to concatenation
    
      Else
    
        Add a space followed by the field to concatenation
    

    这导致了 G2 中的这个公式:-

    =IF(OR(A2="",A2="?"),F2,IF(F2="",A2,F2&" "&A2)

    (需要在 F 列中放置单个撇号才能使其起作用)

    复制时看起来像这样:-

    【讨论】:

    • 这看起来确实是个不错的方法,我已经给了你一个 +1,但我已经实现了我需要用 concat 做的事情,Richard 的方法对我来说很好。
    • 好利奥,感谢。
    猜你喜欢
    • 2021-05-12
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    相关资源
    最近更新 更多