Всем привет! Есть столбец в котором необходимо извлечь символы по условию, если разделитель содержит, последовательно 6 цифр. Пример: MR01A-25-B-200-SL-110861-S текст содержит последовательно 6 цифр 110861, тогда необходимо оставить все кроме данных цифр и дефиса, должно получиться MR01A-25-B-200-SL. То есть сначала мы определяем разделитель это шесть последовательных цифр, а потом применяем его, число, в качестве разделителя добавляя дефис. Можно воспользоваться методом извлечения цифр, потом сосчитать количество если оно равно 6, тогда отсечь нужное, но опять же метод извлечения соберет все в кучу и тут загвоздка... Да и я думаю, есть решение изящнее) Решение нужно в PQ
Ігор Гончаренко, спасибо, но я забыл уточнить решение нужно в PQ Можно мне заменить название темы на : Извлечь символы до разделителя, по условию содержания и количества разделителя в PQ
А вы попробуйте сначала извлечь нужную часть, по которой определяем. Ведь то, что вам нужно находится всегда в одном и том же месте, а точнее после второго разделителя "-", если смотреть с конца строки.
А потом извлечь цифры и посчитать их... ну а дальше по описанной вами логике
Вот тут по шагам расписал, прямо по этапам пройдитесь- посмотрите. А красоту уж сами наведете и оптимизируете финальный код, если потребуется
Код
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, спасибо! Да вы правы можно и простым мышкоклацаньем, но я в одну строчку все запихал
Код
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 букв, то вы все равно откусите кусок, хотя по условия не надо этого делать. Это так и задумывалось?
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
Dyroff написал: Ведь то, что вам нужно находится всегда в одном и том же месте, а точнее после второго разделителя "-", если смотреть с конца строки
То есть Dyroff правильно подметил, что между двумя символами "-" с права в количестве 6ти всегда будут только цифры, последовательно букв в количестве 6ти не будет, выборочно проверил все сходися
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
Ключевое слово выборочно. Ведь не сложно же проверку добавить.
Код
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
#"Вставленный текст перед разделителем"
Вы так Ёё теряете, они не входят в диапазон. Проще так Text.Select("text",{"0".."9"}) И не только проще, но и надежнее чем мой вариант, ибо мой даст сбой при похожести текста на экспоненциальное представление числа.
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
#"Вставленный текст перед разделителем"