Страницы: 1
RSS
Перенести в тексте размер в начало, количество в конец
 
Всем привет!
Помогите решить проблему. Есть файл в ячейках столбца всегда разное содержимое по длине и по содержанию. Нужно найти в ячейках значение размеров и кол-во в упаковке и эти значения расставить по принципу размер в начале строки кол-во в конце. Бывают строки с Pack of 10 и 10 Pack
Прикрепил пример для понимания

Например исходная строка ячейки:
10 Pack Metallic   Bubble Mailers 12 X 17. Green Padded Envelopes Glamour Bubble Mailers   Peel And Seal. Padded Mailing Envelopes For Shipping
Результат должен быть:
12 X 17 Metallic Bubble Mailers Green Padded Envelopes 12X17 Glamour Bubble Mailers Peel And Seal. Padded Mailing Envelopes For Shipping - 10 Pack
Помогите, если это вообще возможно.
 
Весьма неструктурированный текст. Сложно.

Для первого этапа я бы использовал это:
https://www.planetaexcel.ru/techniques/7/4844/
и
https://medium.com/nuances-of-programming/%D1%88%D0%BF%D0%B0%D1%80%D0%B3%D0%B0%D0%BB%D0%BA­%D0%B0-%D0%BF%D0%BE-%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%BC­-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC­-%D0%B2-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B0%D1%85-53820a5f3435

Затем бы начал раскручивать дальше: удалял, извлекал, менял местами.


По хорошему прогнал бы сначала текст через  Power Query, там бы форматнул так, чтобы каждое слово начиналось с заглавной. Удалил бы лишние пробелы.

Ну, хотя бы СЖПРОБЕЛЫ использовал

Начало накидал.
Удачи.
Изменено: Archerius - 05.05.2020 03:02:00
 
Огромное вам спасибо! Неожидал. Для быстрого старта то что нужно.
Единственное подскажите как быть в случае если размер не целое число. Не нашел как решить проблему.
Например:
10.5 X 15 Bubble Mailers Padded Envelopes Large Hot Pink Cushion Mailers - 10 Pack
По вашему регулярному выражению возвращает 5 X 15 а нам нужно 10.5 X 15

Текущее регулярное выражение - \d+ [X] \d+|\d+[.]\d+ [X] \d+[.]\d+

Что подкрутить что-бы учитывало точку?
 
Цитата
Что подкрутить что-бы учитывало точку?
\d+(.\d+)? [X] \d+(.\d+)?
 
Kuzmich, спасибо за ваш ответ. Не работает - если не сложно посмотрите или файл или покажите на пальцах.
 
так ?
 
Да, работает. Ура! excel не сразу просчитал.
Подскажите как реализовать в данном случае без промежуточных столбцов для значений из регулярки как-то так?

В первом столбце значения а в другом уже в виде новое но искомые по регулярке расставлены размер в начале строки а кол-во в конце?
шаблон: (размер) текст (- кол-во)

Например
10 Pack Expandable   Bubble Mailers 10.5 X 15.75 Gusseted Padded Envelopes 10 1/2 X 15 3/4. Large   White Cushion Envelopes. Dual Peel And Seal.
А на выходе уже:
10.5 X 15.75 Expandable   Bubble Mailers Gusseted Padded Envelopes 10 1/2 X 15 3/4. Large   White Cushion Envelopes. Dual Peel And Seal. - 10 Pack
 
magnitu, написал
Цитата
Не работает - если не сложно посмотрите
В вашем файле уберите объединение ячеек в В2 и вставьте туда паттерн
Код
\d+(.\d+)? [X] \d+(.\d+)?
 
Цитата
Kuzmich написал:
\d+(.\d+)? [X] \d+(.\d+)?
Работает. Большое спасибо!
Помогите еще как сделать в одно действие готовую измененную строку?
1. Находить значение размера и кол-во. (уже есть)
2. Удаляет эти значения из строки.
3. После расставляет значения в строке - размер в начале, кол-во в конце.

Это возможно?
 
А вам первый найденный размер (10.5 X 15.75) надо перенести в начало текста?
 
Да первый найденный размер переносить в начало строки а значение количества в конец.
 
Цитата
первое найденное значение размера в начало строки
Код
Function Razmer$(cell$)
  With CreateObject("VBScript.Regexp")
    .Pattern = "\d+(.\d+)? [X] \d+(.\d+)?"
     Razmer = .Execute(cell)(0)
     Razmer = Razmer & " " & .Replace(cell, "")
  End With
End Function

Про количество я пока не понял
 
Попробую. Я думал логика может такая: Регулярки находят значения (размер и кол-во),  какая-то функция или формула удаляет эти найденные значения в исходной строке и уже в очищенной строке от этих значений проставляет в начало и конец опять же значения из найденных регуляркой.
 
При условии, что размер и количество есть в строке
Код
Function Razmer$(cell$)
Dim temp As String
  With CreateObject("VBScript.Regexp")
    .Pattern = "\d+(.\d+)? [X] \d+(.\d+)?"
     temp = .Execute(cell)(0)
     temp = temp & " " & .Replace(cell, "")
     .Pattern = "\d+ Pack|\d+  Pack|\bPack Of\b \d+"
     Razmer = .Replace(temp, "") & " - " & .Execute(temp)(0)
  End With
End Function
 
ОГРОМНОЕ СПАСИБО!!!
Работает отлично! Это для меня супер нужная вещь!
 
С проверкой
Код
Function Razmer$(cell$)
Dim temp As String
  With CreateObject("VBScript.Regexp")
    .Pattern = "\d+(.\d+)? [X] \d+(.\d+)?"
    If .test(cell) Then
      temp = .Execute(cell)(0)
      temp = temp & " " & .Replace(cell, "")
    Else
      temp = cell
    End If
     .Pattern = "\d+ +Pack|\bPack Of\b \d+"
     If .test(temp) Then
       Razmer = .Replace(temp, "") & " - " & .Execute(temp)(0)
     Else
       Razmer = temp
     End If
  End With
End Function
 
Подготовил таблицу и тут заметил особенность, если строка начинается с Pack Of то функция не корректно отрабатывает
Pack Of 10 Light   Rose Gold Metallic Color Envelopes Usable Space 7 X 9
На выходе
7 X  Of 10 Light Rose Gold Metallic Color   Envelopes Usable Space  - 9 Pack
Пробовал разные варианты регулярки - не выходит.

Помогите еще раз пожалуйста.
 
см.стр. 24 примера (и в аналогичных)
регулярка для размеров: \d+([.]\d+)?[Xx ]+\d+([.]\d+)?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Попробуйте так
Код
Function RazmerKol$(cell$)
Dim Razmer As String
Dim Kol As String
Dim temp As String
  With CreateObject("VBScript.Regexp")
    .Pattern = "\d+(.\d+)? [X] \d+(.\d+)?"
    If .test(cell) Then
      Razmer = .Execute(cell)(0)
      temp = .Replace(cell, "")
    Else
      temp = cell
    End If
     .Pattern = "\d+ +Pack|\bPack Of\b \d+"
     If .test(temp) Then
       Kol = .Execute(temp)(0)
       RazmerKol = Razmer & " " & .Replace(temp, "") & " - " & Kol
     Else
       RazmerKol = Razmer & temp
     End If
  End With
End Function
Изменено: Kuzmich - 06.05.2020 00:20:57
Страницы: 1
Наверх