【问题标题】:Truncating Text To Full Words Based On Character Limit - Excel根据字符限制将文本截断为完整的单词 - Excel
【发布时间】:2020-05-26 23:41:17
【问题描述】:

我正在处理一些数据(DataSet#1),它的文本字段使用一些非常规逻辑截断:

  • 如果“服务类型描述”> 60 个字符,则将名称缩减为 完整 个字

我的问题是我需要在 excel 中格式化一些其他数据 (DataSet#2) 以匹配在我们的报告服务器后端应用的这个逻辑(在我的控制之外)。似乎也没有人能找到所有可能被截断的描述的列表。

Dataset#1 是实时的,可以随时用更新的数据重新拉取,所以我需要创建一个模板,允许我从 DataSet#2 的列表中提取信息(目前有完整的描述) 根据 DataSet#1 中修剪后的服务类型描述,放入 Dataset#1 的任何副本中。


示例: 以下是完整的产品名称,以及我的DataSet#2中的产品名称:

  • “FNMA 1025 Small Residential Income Property Appraisal & FNMA 216 Addendum”(73 个字符,包括空格)

只需将此文本修剪为

  • “FNMA 1025 小型住宅收入财产评估和 FNM”

但是,同样的产品,在主数据(DataSet#1)中的命名如下:

  • “FNMA 1025 Small Residential Income Property Appraisal &”(56 个字符,8 个“单词”,包括 &)

DataSet#1 后端的逻辑已将完整的产品名称修剪为 60 个字符以下,但仅保留完整的单词(删除“FNM”部分单词)。


理想情况下,我必须能够获取具有完整描述名称的列表 - 并在 Excel(或 VBA)中应用逻辑,这将产生与来自其他数据集的修剪数据相同的结果 - 然后允许我拉根据服务类型描述从数据集#2(完整的产品名称)到数据集#1 的信息。

【问题讨论】:

    标签: excel vba word-count texttrimming character-limit


    【解决方案1】:

    你可以使用类似的东西

    Function truncate_string(strInput As String, Optional lngChars As Long = 60)
    
    Dim lngCharInstance As Long
    
    
    lngCharInstance = Len(strInput)
    
    While lngCharInstance > lngChars 
       lngCharInstance = InStrRev(strInput, " ", _
                        IIf(lngCharInstance >= Len(strInput), _
                        Len(strInput), lngCharInstance - 1))
    Wend
    
    truncate_string = Mid(strInput, 1, lngCharInstance)
    
    End Function
    

    会这样称呼

    truncate_string("FNMA 1025 Small Residential Income Property Appraisal & FNMA 216 Addendum")

    返回如下

    FNMA 1025 Small Residential Income Property Appraisal &

    或类似,例如 30 个字符

    truncate_string("FNMA 1025 Small Residential Income Property Appraisal & FNMA 216 Addendum",30)

    给了

    FNMA 1025 Small Residential

    希望这会有所帮助,因为那里有一个循环,我会看看无限循环的可能性。

    【讨论】:

    • 谢谢 - 这正是我所需要的,可选的字符数变量很有帮助,因为事实证明在同一数据集中还有其他字段以不同的长度被截断。根据实现需要,我在条件 IF 语句中调用此函数 - 以避免函数在遇到空白值或大于数据库字段最大值(200 字符)的值时运行 - 这意味着它不是需要的字段截断:=IF(OR(LEN(A2)>200,LEN(A2)<1,A2=""), truncate_string(A2))
    【解决方案2】:

    您可以为此使用正则表达式。

    Option Explicit
    Function trimLength(S As String, Optional Length As Long = 60) As String
        Dim RE As Object, MC As Object
        Dim sPat As String
    
    sPat = "^.{1," & Length - 1 & "}(?=\s|$)"
    
    If Len(S) > 60 Then
        Set RE = CreateObject("vbscript.regexp")
        With RE
            .Pattern = sPat
            .MultiLine = True
            Set MC = .Execute(S)
                trimLength = MC(0)
        End With
    Else
        trimLength = S
    End If
    
    End Function
    

    请注意,根据您的问题,我们会从所需长度中减去一个。

    正则表达式的解释

    将长度修剪为整个单词

    ^.{1,59}(?=\s|$)
    

    选项:^$ 匹配换行符

    使用RegexBuddy创建

    【讨论】:

      猜你喜欢
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多