Страницы: 1
RSS
Извлечь символы до разделителя, по условию содержания и количества разделителя
 
Всем привет!
Есть столбец в котором необходимо извлечь символы по условию, если разделитель содержит, последовательно 6 цифр. Пример:
MR01A-25-B-200-SL-110861-S текст содержит последовательно 6 цифр 110861, тогда необходимо оставить все кроме данных цифр и дефиса, должно получиться MR01A-25-B-200-SL. То есть сначала мы определяем разделитель это шесть последовательных цифр, а потом применяем его, число, в качестве разделителя добавляя дефис.
Можно воспользоваться методом извлечения цифр, потом сосчитать количество если оно равно 6, тогда отсечь нужное, но опять же метод извлечения соберет все в кучу и тут загвоздка... Да и я думаю, есть решение изящнее)
Решение нужно в PQ
Изменено: Adamm - 12.03.2021 17:05:35
 
Код
=ЕСЛИ(И(ДЛСТР([@[Support Mark]])=26;ПСТР([@[Support Mark]];25;1)="-");ЛЕВБ([@[Support Mark]];ДЛСТР([@[Support Mark]])-9);"")
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, спасибо, но я забыл уточнить решение нужно в PQ
Можно мне заменить название темы на : Извлечь символы до разделителя, по условию содержания и количества разделителя в PQ
Изменено: Adamm - 12.03.2021 17:05:00
 
А вы попробуйте сначала извлечь нужную часть, по которой определяем. Ведь то, что вам нужно находится всегда в одном и том же месте, а точнее после второго разделителя "-", если смотреть с конца строки.

Вот и извлечь, все что между разделителями

Код
Text.BetweenDelimiters([Support Mark], "-", "-", {1, RelativePosition.FromEnd}, 0)


А потом извлечь цифры и посчитать их... ну а дальше по описанной вами логике

Вот тут по шагам расписал, прямо по этапам пройдитесь- посмотрите. А красоту уж сами наведете и оптимизируете финальный код, если потребуется
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Between = Table.AddColumn(Источник, "Текст между разделителями", each Text.BetweenDelimiters([Support Mark], "-", "-", {1, RelativePosition.FromEnd}, 0), type text),
    TextLong = Table.AddColumn(Between, "Длина", each Text.Length([Текст между разделителями]), Int64.Type),
    Filter = Table.SelectRows(TextLong, each ([Длина] = 6))
in
    Filter
Изменено: Dyroff - 12.03.2021 17:32:04
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Dyroff, спасибо! Да вы правы можно и простым мышкоклацаньем, но я в одну строчку все запихал
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Вставленный текст перед разделителем" = Table.AddColumn(Источник, "Текст перед разделителем", each 
if Text.Length(Text.BetweenDelimiters([Support Mark], "-", "-", {1, RelativePosition.FromEnd}, 0))=6 
then Text.BeforeDelimiter([Support Mark], "-"&Text.BetweenDelimiters([Support Mark], "-", "-", {1, RelativePosition.FromEnd}, 0)&"-") 
else [Support Mark])
in
    #"Вставленный текст перед разделителем"
 
Adamm, тогда ваш код не соответствует постановке задачи из первого сообщения, вы проверяете количество символов, но не их содержание, т.е. если там будет 6 букв, то вы все равно откусите кусок, хотя по условия не надо этого делать. Это так и задумывалось?
Вот горшок пустой, он предмет простой...
 
У кого нет PQ
Код
Function Del6Digits(cell As String)
Dim re As Object
  Set re = CreateObject("vbscript.regexp")
    re.Global = True
    re.Pattern = "-\d{6}-"
    Del6Digits = re.Replace(cell, "")
End Function
 
PooHkrd, нет не задумывалось
Цитата
Dyroff написал:
Ведь то, что вам нужно находится всегда в одном и том же месте, а точнее после второго разделителя "-", если смотреть с конца строки
То есть Dyroff правильно подметил, что между двумя символами "-" с права в количестве 6ти всегда будут только цифры, последовательно букв в количестве 6ти не будет, выборочно проверил все сходися

 
Kuzmich, спасибо!
 
Цитата
PooHkrd написал:
т.е. если там будет 6 букв, то вы все равно откусите кусок, хотя по условия не надо этого делать. Это так и задумывалось?

Да, абсолютно правильное замечание.
Тут необходимо провести извлечение цифр тогда
Код
Text.Remove(Text.BetweenDelimiters([Support Mark], "-", "-", {1, RelativePosition.FromEnd}, 0),{"А".."я"," ","A".."z"})


И в итоге будет так
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Between = Table.AddColumn(Источник, "Текст между разделителями", each Text.Remove(Text.BetweenDelimiters([Support Mark], "-", "-", {1, RelativePosition.FromEnd}, 0),{"А".."я"," ","A".."z"}), type text),
    TextLong = Table.AddColumn(Between, "Длина", each Text.Length([Текст между разделителями]), Int64.Type),
    Filter = Table.SelectRows(TextLong, each ([Длина] = 6))
in
    Filter


Цитата
Adamm написал:
но я в одну строчку все запихал

Можно и в одну строчку, но читаемость кода страдает тогда. Ну, тут уже на вкус и цвет)
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Цитата
Adamm написал:
выборочно проверил все сходися
Ключевое слово выборочно. Ведь не сложно же проверку добавить.
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Вставленный текст перед разделителем" = Table.AddColumn(Источник, "Текст перед разделителем", each 
        if let t = Text.BetweenDelimiters([Support Mark], "-", "-", {1, RelativePosition.FromEnd}, 0) in Text.Length(t)=6 and (try Number.From(t) otherwise t) is number
            then Text.BeforeDelimiter([Support Mark], "-"&Text.BetweenDelimiters([Support Mark], "-", "-", {1, RelativePosition.FromEnd}, 0)&"-") 
            else [Support Mark])
in
    #"Вставленный текст перед разделителем"
Вот горшок пустой, он предмет простой...
 
Цитата
Dyroff написал:
{"А".."я"," ","A".."z"}
Вы так Ёё теряете, они не входят в диапазон.
Проще так
Text.Select("text",{"0".."9"})
И не только проще, но и надежнее чем мой вариант, ибо мой даст сбой при похожести текста на экспоненциальное представление числа.
Изменено: PooHkrd - 12.03.2021 21:15:36
Вот горшок пустой, он предмет простой...
 
PooHkrd, Ага, спасибо, учту)
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
PooHkrd, Да, да вы правы, тут я упустил момент! Но вот тут microsoft меня запутал
Код
Number.From(t)
как я понял мы и проверяем цифра это или нет?
Если честно я с функцией "t" вообще залип, не понимаю от куда и зачем in и is...
Изменено: Adamm - 12.03.2021 21:56:10
 
Берите вариант проверки от Dyroff, он надежнее:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Вставленный текст перед разделителем" = Table.AddColumn(Источник, "Текст перед разделителем", each 
if Text.Length( Text.Select( Text.BetweenDelimiters([Support Mark], "-", "-", {1, RelativePosition.FromEnd}, 0), {"0".."9"} ) )=6 
then Text.BeforeDelimiter([Support Mark], "-"&Text.BetweenDelimiters([Support Mark], "-", "-", {1, RelativePosition.FromEnd}, 0)&"-") 
else [Support Mark])
in
    #"Вставленный текст перед разделителем"
Изменено: PooHkrd - 12.03.2021 22:16:08
Вот горшок пустой, он предмет простой...
 
PooHkrd, ок!
Страницы: 1
Наверх