Усечение текста до полных слов на основе ограничения по символам - Excel - PullRequest
0 голосов
/ 11 февраля 2020

Я работаю с некоторыми данными (DataSet # 1), текстовое поле которых обрезано с использованием некоторых нестандартных логи c:

  • Если «Описание типа службы»> 60 символов, обрезать имя до <60 символов, но только <strong>полное слова

Моя проблема заключается в том, что мне нужно отформатировать некоторые другие данные (DataSet # 2) в Excel, чтобы соответствовать этой логике c, который применяется на серверной части нашего сервера отчетов (вне моего контроля). Никто не может найти список всех потенциальных усеченных описаний.

Набор данных # 1 активен и может быть повторно получен с обновленными данными в любое время, поэтому мне нужно создать шаблон, который позволит мне извлекать информацию из списка в наборе данных № 2 (который в настоящее время имеет описания полной длины) в любую копию набора данных № 1 на основе обрезанного описания типа службы в наборе данных № 1.


Пример. Ниже приводится полное название продукта и название продукта в моем наборе данных №2:

  • "FNMA 1025 Оценка имущества малых жилых домов и приложение FNMA 216 "(73 символа, включая пробелы)

Простая обрезка этого текста до <60 символов (59) приведет к: </p>

  • " FNMA 1025 Оценка жилой недвижимости FNM "

Однако этот же продукт в основных данных (DataSet # 1) назван следующим образом:

  • " FNMA 1025 Оценка жилой недвижимости для небольших доходов & " (56 символов, 8 «слов», включая &)

Лог c в серверной части для DataSet # 1 обрезал полное имя продукта до 60 символов, но сохраняет только полное слова (удаляет частичное слово «FNM»).


В идеале я должен иметь возможность взять список с полным именем описания - и применить logi c в Excel (или VBA), который даст тот же результат, что и обрезанные данные из других er набор данных - который затем позволяет мне извлекать информацию из набора данных № 2 (полные названия продуктов) в набор данных № 1 на основе описания типа сервиса.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Для этого вы можете использовать регулярные выражения.

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

enter image description here

Обратите внимание, что в соответствии с вашим вопросом мы вычитаем одно из желаемых длина.

Объяснение регулярного выражения

Длина обрезки до целого слова

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

Параметры: ^ $ совпадение при переносе строки

Создано с помощью RegexBuddy

0 голосов
/ 11 февраля 2020

Вы можете использовать что-то вроде этого

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

Надеюсь, это поможет, так как там есть oop, я бы посмотрел на возможности любого потенциала для бесконечных циклов.

...