Разбор несогласованно отформатированных текстовых данных в Excel

265
smj7v3

У меня проблемы с анализом текста из таблицы. У меня есть электронная таблица с сотнями записей, которые похожи на приведенный ниже пример (это все в одной ячейке):

7431340 03 POOLS E TECHNOLOGIES INC 90 NEW ENGLAND DRIVE 16 0.00 6,900 7,060 

Мне нужно разобрать каждое из следующего в отдельные ячейки:

[7431340] [03 POOLS E TECHNOLOGIES INC] [90 NEW ENGLAND DRIVE] [7,060] 

или как это будет выглядеть в листе Excel

Конечный результат в Excel с указанием первого числа в столбце A, номера плюс название компании в столбце B, адреса улицы в столбце C и последнего номера в строке в столбце D

У меня проблема в том, что данные для каждой записи противоречивы. Больше примеров:

7170258 111 HARBOR POINT OWNER LLC 115 TOWNE STREET 16 0.00 189,200 196,730 4469000 4 KIDZ INC 62 SOUTHFIELD AVENUE 16 0.00 3,000 9,500 6369875 3 HERMANOS LLC 912 EAST MAIN STREET 16 0.00 4,640 4 640 

Я хотел бы избежать как можно большего количества ручных манипуляций, но боюсь, что мне не повезет.

Как мне проанализировать данные, если их формат не соответствует?

0
В приведенном вами примере выбрасываются два числовых значения после адреса улицы; это будет соответствовать? Похоже, что первое правило заключается в том, чтобы перетащить первую числовую строку в ячейку, второе правило состоит в том, чтобы сразу после этого взять числа и добавить к названию компании, чтобы перейти во вторую ячейку, третье правило - в том, чтобы переместить адрес в третью ячейку, и правило четвертое переводит последнее значение в формате запятой в четвертую ячейку, отбрасывая три числовых значения между ним и концом адреса улицы. Это верно? K7AAY 6 лет назад 1
Как указывает @ K7AAY, вы не объяснили правила принятия решения о том, как данные должны быть разделены на четыре ячейки. Пожалуйста, отредактируйте свой вопрос, чтобы добавить эту информацию. Мне еще несколько примеров тоже помогут. Blackwood 6 лет назад 0
@ K7AAY Парсинг первой и последней числовой строки всегда согласован, что является легкой частью. Реальная проблема, которую я имею, состоит в том, чтобы разобрать две части информации в середине. Вот где лежат несоответствия. smj7v3 6 лет назад 0
Как я уже писал, если ваши данные действительно репрезентативны, мое решение должно работать. Если это не так, вам нужно будет предоставить примеры того, где он не работает, чтобы увидеть, есть ли какой-то полезный шаблон. Ron Rosenfeld 6 лет назад 0

2 ответа на вопрос

0
Ron Rosenfeld

Если ваши примеры действительно репрезентативны, то существует шаблон, который можно извлечь с помощью регулярных выражений. Это может быть реализовано в Excel с использованием VBA.

Шаблон:

  • Начало строки
  • Серия цифр с последующим пробелом
  • Подстрока, которая начинается с одной или нескольких цифр и не содержит других цифр
  • вторая подстрока, которая начинается с одной или нескольких цифр и не содержит других цифр
  • несколько разделенных пробелами групп с запятыми, с необязательной запятой (возврат последней)

Все ваши примеры показывают эту модель. Вот пользовательская функция, которая будет обрабатывать это:

Option Explicit Function extrAddressPart(sAddr As String, lPart As Long) Dim RE As Object, MC As Object Const sPat As String = "^(\d+)\s+(\d+\D+)\s+(\d+\D+)\s+.*\s+([\d,]+)$"  Set RE = CreateObject("vbscript.regexp") With RE .Pattern = sPat .MultiLine = True .Global = False If .Test(sAddr) = True Then Set MC = .Execute(sAddr) extrAddressPart = MC(0).submatches(lPart - 1) End If End With End Function 

enter image description here

Конечно, если ваш пример не является действительно представительным, то это решение не будет работать.

Excel не может делать регулярные выражения в поиске и замене? Я использую LibreOffice Calc, и он может. Moss 6 лет назад 0
Лучше добавить несколько примеров того, как использовать функцию ,, и еще один OP со смешанным разделителем, это будет работать для всех! Rajesh S 6 лет назад 0
@RajeshS Какие у вас проблемы с использованием функции? И в его примерах единственным символом-разделителем является ``. Ron Rosenfeld 6 лет назад 0
@RonRosenfeld, проверьте мое решение там, я покажу, как использовать функцию, `= ReplaceAndSplit (A2,", ")`. Лично у меня нет никаких проблем, но для других это может быть так, что я написал! Rajesh S 6 лет назад 0
@RajeshS В своем решении вы упоминаете различные разделители. Единственным разделителем в примерах являетсяи когда это используется, ваш UDF просто разбивает строку на отдельные слова. Посмотрите на мой скриншот для лучшего понимания того, как выглядят его примеры. Ron Rosenfeld 6 лет назад 0
@RonRosenfeld, да, я показал, как работать с различными разделителями, поскольку у OP есть предложения внутри `[]`, `Comma` &` Space`. Rajesh S 6 лет назад 0
@RajeshS Но ЕДИНСТВЕННЫЙ разделитель, который он использует в своих примерах, является пробелом, а ваш UDF просто разбивает строку на отдельные слова. (Запятые в его примере - это разделители тысяч; а скобки - просто индикаторы того, как он хочет, чтобы строка была проанализирована). Возможно, вам следует показать, как ваше решение будет работать на ЕГО примерах, возможно, со скриншотом, как я. Ron Rosenfeld 6 лет назад 0
Давайте [продолжим это обсуждение в чате] (https://chat.stackexchange.com/rooms/84180/discussion-between-rajesh-s-and-ron-rosenfeld). Rajesh S 6 лет назад 0
0
Rajesh S

Поскольку вы имеете дело с несколькими разделителями, в таком случае я хотел бы предложить вам два возможных решения.

Решение 1 (VBA Macro):

Function ReplaceAndSplit(ByRef Text As String, ByRef DelimChars As String) As String() Dim DelimLen As Long, Delim As Long Dim strTemp As String, Delim1 As String, Arr() As String, ThisDelim As String strTemp = Text Delim1 = Left$(DelimChars, 1) DelimLen = Len(DelimChars) For Delim = 2 To DelimLen ThisDelim = Mid$(DelimChars, Delim, 1) If InStr(strTemp, ThisDelim) <> 0 Then _ strTemp = Replace(strTemp, ThisDelim, Delim1) Next ReplaceAndSplit = Split(strTemp, Delim1) End Function 

Как это устроено:

  1. Введите этот код как Модуль вместе с Листом.
  2. Напишите эту формулу в ячейке желаний, затем заполните ее до нужного уровня, нажмите F2и закончите с помощью Ctrl+Shift+Enter.

    {=ReplaceAndSplit(A2,",")}

Замечания:

  1. ","это Commaкак разделитель.
  2. Это должно быть " "для Space.
  3. "[ ]"для Brackets.

Решение 2 (Формула Excel):

=SUBSTITUTE(TRIM(MID(SUBSTITUTE($A1,",",REPT(" ",256)),(COLUMNS($A:A)-1)*255+1,255)),"]","") 

Замечания:

Вам нужно отредактировать эту часть формулы в соответствии с разделителем, прежде чем выполнять ее, например,

  1. SUBSTITUTE($A1,","для в Commaкачестве разделителя.
  2. SUBSTITUTE($A1," "для в Spaceкачестве разделителя.
  3. SUBSTITUTE($A1,"["для в Bracketкачестве разделителя.
Я думаю, что вы неправильно понимаете его примеры. Его вторая строка с квадратными скобками `[]` показывает, как он хочет, чтобы первая строка разбивалась на ячейки. И запятые - это разделитель тысяч; не разделитель. Ron Rosenfeld 6 лет назад 0
@RonRosenfeld ,, над ним OP написала: `Мне нужно разобрать каждое из следующего в отдельные ячейки:` и OP хочет поместить данные внутри `[]` в отдельные ячейки ☺ Rajesh S 6 лет назад 0
Ну, один из нас явно не понимает его примеров. Ron Rosenfeld 6 лет назад 0
@ Рон Розенфельд может быть, так что лучше пусть ОП решит ☺ Rajesh S 6 лет назад 0
@RonRosenfeld Вы правы в своей интерпретации. Скобки представляют ячейку. Я думал, что это будет хорошим визуальным представлением. smj7v3 6 лет назад 0
Добавлен фрагмент скриншота листа Excel, чтобы показать, как будет выглядеть пример, на основе описания OP. K7AAY 6 лет назад 0

Похожие вопросы