Страницы: 1
RSS
Как вытащить количество из строки текста?
 
Добрый день!

База присылает ЭксЭль список с наименованием товара (столбец 2). В столбце 3 указано количество коробов.
Мне в столбец 4 нужно вставить количество штук (бутылок). Количество бутылок указано в наименовании – в столбце 2 после «по»… Например (строка 1):
Бек Блауфранкиш 2016 ЗНМП кр. сух. 0,75л по 6 Юдит Бек ГмбХ/Австрия/ - здесь 6 бутылок.

Как мне количество 6 вытащить в отдельный столбец???
 
=PO(RC[-2])
где РО
Код
Function PO&(rg As Range)
  Dim re
  Set re = CreateObject("VBScript.RegExp"): re.Pattern = "по (\d+)"
  If re.test(rg) Then PO = Val(re.Execute(rg)(0).submatches(0))
End Function
Изменено: Ігор Гончаренко - 17.06.2019 16:48:07
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Добрый день. Можно еще так:
Код
=ПСТР(B3;ПОИСК(" по ";B3)+4;ПОИСК(" ";B3;ПОИСК(" по ";B3)+3)-(ПОИСК(" по ";B3)+1))


З.ы. если в тексте после количества тары не будет пробела - никаких гарантий.
Хы! Еще раз з.ы. - если учесть, что стандартная коробка под винчик это либо 6, либо 12, можно еще так:
Код
=ЕСЛИ(ЕОШ(ПОИСК("по 6";B3));12;6)
Изменено: Пытливый - 17.06.2019 19:14:51
Кому решение нужно - тот пример и рисует.
 
Цитата
Пытливый написал:
если учесть, что стандартная коробка под винчик это либо 6, либо 12, можно еще так:
НЕТ - в зависимости от объема. Бывает и 4 шт. Бывает и 20. А ёмк. 0,25 - может быть и 40. НО Все равно - СПАСИБО!
Изменено: kolyale - 17.06.2019 16:57:56
 
kolyale, как раз под Вашу тему. Посмотрите
 
Цитата
Пытливый написал:
З.ы. если в тексте после количества тары не будет пробела - никаких гарантий.
Обидно до "ПОРОСЯЧЕГО Визга" -  Бывает, что после "ПО" и после количества ТАРЫ НЕТ пробелов... А бывает и несколько пробелов!!!
Вот - реальный пример:

Монтепульчано Д'Абруццо Платео выдержанное 2011 кр. сух. 0,75 по 6Азиенда Агриверде(деревянный ящик)
 
Stics, примеры полезные, но не мой случай. Попробовал - В строке много цифр, CTRL+E вытаскивает все – и год и емкость и количество. А мне нужно ОПРЕДЕЛЕННО – Только количество. После слова «ПО».
 
Цитата
kolyale написал: ...НЕТ пробелов... А бывает и несколько пробелов...
В решении, предложенном Игорем (сообщение #2), вместо  "по (\d+)" запишите "по {0,9}(\d+)"
Можно и ускорить код:
Код
Function PO(Txt As String) As Long
  Dim re As Object
  If re Is Nothing Then
    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "по( ?)+(\d+)"
  End If
  With re.Execute(Txt)
    If .Count Then
      PO = .Item(0).submatches(1)
    End If
  End With
End Function
Изменено: ZVI - 17.06.2019 22:59:15
 
Цифры, это как  буквы алфавита. Буква "я" = слову "я". Цифра 9 = числу 9. А число 10 - шалиииишь, нет такой цифры... :). Примерно как нет буквы "Ты". :)
Но это лирика. По сути вопроса - можно посоветовать почитать вот этот приемчик из коллекции уважаемого автора сайта.
Не менее уважаемый Ігор Гончаренко, вам уже предложил решение с использованием этих самых регулярок выше.
Изменено: Пытливый - 17.06.2019 17:54:02
Кому решение нужно - тот пример и рисует.
 
С учетом отсутствующих пробелов после количества:
=МАКС(ЕСЛИ(ЕЧИСЛО(--ЛЕВБ(ПСТР(B3;ПОИСК(" по ";B3)+4;9);{1;2;3;4;5}));--ЛЕВБ(ПСТР(B3;ПОИСК(" по ";B3)+4;9);{1;2;3;4;5})))
 
Вариант на Power Query:
Код
let
    fnTextListReplace = (t as text, r as text, i as number)=>
    let
        a = Text.Replace( t, Text.From(i), r ),
        b = if i = 0 then t else @fnTextListReplace( a, r, i - 1 )
    in
        b,
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Spaces = Table.AddColumn(Source, "БезП", each Text.Replace([Винище], " ", ""), type text),
    Digits = Table.AddColumn(Spaces, "БезЦ", each fnTextListReplace( [БезП], "~", 9 )),
    Position = Table.AddColumn(Digits, "КоличествоПузырей", each Number.From( Text.Select( Text.Range( [БезП], Text.PositionOf( [БезЦ], "по~", Occurrence.Last ), 5), {"0".."9"} ) ), Int64.Type ),
    Out = Table.SelectColumns(Position,{"Винище", "КоличествоПузырей"})
in
    Out

В синюю табличку вставляете ваши наименования, по зеленой табличке ПКМ и выбираете пункт меню обновить.
Не работает для количества бутылок в коробке больше чем 999.
Вот горшок пустой, он предмет простой...
 
Доброе время суток
Цитата
ZVI написал:
"по( ?)+(\d+)"
Владимир, подскажите, пожалуйста, чем такая конструкция выгоднее чем просто по "по +(\d+)"?
 
Цитата
Андрей VG написал: чем такая конструкция выгоднее
Добрый вечер, Андрей.
В сообщении  #8 автор уточнил, что "Бывает, что после "ПО" ... НЕТ пробелов... А бывает и несколько пробелов.
Маска как раз для таких ситуаций, когда после "по" перед числом нет или есть сколько-нибудь пробелов.
А вариант "по +(\d+)" не сработает, если между "по" и числом не окажется пробела.
Изменено: ZVI - 17.06.2019 21:29:33
 
по +(\d+) - требует минимум 1-го пробела после "по"
а
по *(\d+) - "ничего" не требует, а просто допускает наличение неопределнного количества пробело после "по" в т.ч. и их полное отсутсвие тоже подходит
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал: *(\d+)
Игорь, использование "*" не очень корректно, насколько я понял из примера данных, так как среагирует и на другие числа в тексте.
 
возможно...
а пример таких данных можно посмотреть, в которых "по *(\d+)" потянет из них что-то не то?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Игорь, "по *(\d+)" - у Вас правильно, конечно. В сообщении #18 без кавычек я увидел только маску "*(\d+)"  :)
 
Цитата
ZVI написал:
после "ПО" ... НЕТ пробелов...
Владимир, спасибо, пропустил :(  Но тогда соглашусь с Игорем, не вижу какой-либо ошибки в "по *(\d+)", разве что будет нечто вроде
"Вино Лимпопо 1,25 литра выдержанное по 12" :)
 
Володя,
я писал о примерах, реально с целью увидеть нечто, что я провтыкал
потому что RegExp'ом пользуюсь давно, но бывает сам себе такие сюрпризы устраиваю...
языки программирования - очень искусственный продукт человеческой деятельности
а маски в RegExp - это тот же язык программирования очень узко направленный, очень лаконичный и от этого еще более не понятный и не естественный
не зря об этом пишут книги и надеюсь очень скоро ВСЕ поисковые системы начнут использовать маски RegExp
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
надеюсь очень скоро ВСЕ поисковые системы начнут использовать маски RegExp
Осталось только выяснить, будут ли они пользоваться только одним диалектом? Например, функции в Google Spreadsheet для работы с регулярными выражениями базируются на этом диалекте.
И выясняется, что, например такое, не поддерживается
(?=re) before text matching «re» NOT SUPPORTED
(?!re) before text not matching «re» NOT SUPPORTED
 
Да - фраза "по *(\d+)" сработала идеально - СПАСИБО!
Страницы: 1
Наверх