根据字符限制将文本截断为完整单词 - Excel
Truncating Text To Full Words Based On Character Limit - Excel
我正在处理一些数据 (DataSet#1),其中的文本字段被一些非常规逻辑截断了:
- 如果 "Service Type Description" 是 > 60 个字符,Trim 名称减少到 < 60 个字符,但只有 完整 个单词
我的问题是我需要格式化 excel 中的一些其他数据 (DataSet#2) 以匹配在我们的报告服务器后端应用的逻辑(在我的控制之外)。似乎也没有人能找到所有可能被截断的描述的列表。
Dataset#1 是实时的,可以随时用更新的数据重新拉取,所以我需要创建一个模板,允许我从 DataSet#2 的列表中拉取信息(目前有完整的长度描述)到数据集#1 的任何副本中,基于数据集#1 中经过修剪的服务类型描述。
示例:
以下是完整的产品名称,以及我的 DataSet#2 中的产品名称:
- "FNMA 1025 Small Residential Income Property Appraisal & FNMA 216 Addendum"(73个字符,包括空格)
简单地将此文本修剪为 <60 个字符 (59) 会产生:
- "FNMA 1025 Small Residential Income Property Appraisal & FNM"
但是,同一产品在主数据 (DataSet#1) 中的命名如下:
- "FNMA 1025 Small Residential Income Property Appraisal & "(56个字符,8个"words",包括&)
DataSet#1 的后端逻辑已将完整的产品名称削减到 60 个字符以下,但仅保留完整的单词(删除 "FNM" 部分单词)。
理想情况下,我必须能够获取具有完整描述名称的列表 - 并在 Excel(或 VBA)中应用逻辑,这将产生与修剪后的数据相同的结果另一个数据集 - 然后允许我根据服务类型描述将信息从数据集#2(完整的产品名称)提取到数据集#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")
并且会return如下
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
希望这对您有所帮助,因为其中有一个循环,我会看看无限循环的可能性。
您可以为此使用正则表达式。
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
请注意,根据您的问题,我们将所需长度减一。
正则表达式的解释
Trim 全字长度
^.{1,59}(?=\s|$)
选项:^$匹配换行符
- Assert position at the beginning of a line
^
- Match any single character that is NOT a line break character
.{1,59}
- Assert that the regex below can be matched starting at this position (positive lookahead)
(?=\s|$)
- Match this alternative
\s
- Or match this alternative
$
- Assert position at the end of a line
$
创建于RegexBuddy
我正在处理一些数据 (DataSet#1),其中的文本字段被一些非常规逻辑截断了:
- 如果 "Service Type Description" 是 > 60 个字符,Trim 名称减少到 < 60 个字符,但只有 完整 个单词
我的问题是我需要格式化 excel 中的一些其他数据 (DataSet#2) 以匹配在我们的报告服务器后端应用的逻辑(在我的控制之外)。似乎也没有人能找到所有可能被截断的描述的列表。
Dataset#1 是实时的,可以随时用更新的数据重新拉取,所以我需要创建一个模板,允许我从 DataSet#2 的列表中拉取信息(目前有完整的长度描述)到数据集#1 的任何副本中,基于数据集#1 中经过修剪的服务类型描述。
示例: 以下是完整的产品名称,以及我的 DataSet#2 中的产品名称:
- "FNMA 1025 Small Residential Income Property Appraisal & FNMA 216 Addendum"(73个字符,包括空格)
简单地将此文本修剪为 <60 个字符 (59) 会产生:
- "FNMA 1025 Small Residential Income Property Appraisal & FNM"
但是,同一产品在主数据 (DataSet#1) 中的命名如下:
- "FNMA 1025 Small Residential Income Property Appraisal & "(56个字符,8个"words",包括&)
DataSet#1 的后端逻辑已将完整的产品名称削减到 60 个字符以下,但仅保留完整的单词(删除 "FNM" 部分单词)。
理想情况下,我必须能够获取具有完整描述名称的列表 - 并在 Excel(或 VBA)中应用逻辑,这将产生与修剪后的数据相同的结果另一个数据集 - 然后允许我根据服务类型描述将信息从数据集#2(完整的产品名称)提取到数据集#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")
并且会return如下
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
希望这对您有所帮助,因为其中有一个循环,我会看看无限循环的可能性。
您可以为此使用正则表达式。
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
请注意,根据您的问题,我们将所需长度减一。
正则表达式的解释
Trim 全字长度
^.{1,59}(?=\s|$)
选项:^$匹配换行符
- Assert position at the beginning of a line
^
- Match any single character that is NOT a line break character
.{1,59}
- Assert that the regex below can be matched starting at this position (positive lookahead)
(?=\s|$)
- Match this alternative
\s
- Or match this alternative
$
- Assert position at the end of a line
$
- Assert position at the end of a line
- Match this alternative
创建于RegexBuddy