Страницы: 1 2 След.
RSS
Power Query извлечение числа в отдельную колонку
 
Есть столбец в котором в отдельных строках крайние правые значения текста содержат числа (1,0  0,5 0,4 и т.д). Мне нужно извлечь их в отдельную колонку.

Я пробую это сделать следующим образом, так как знаю что в "Column1" находится группировка по которой я могу отсечь строки в которых искать не нужно (хотя в 1% в отобранных строках колонки "Column2" не будет числовых значений).

Попробовал - выдает null.

Как можно решить задачу?
Код
Add = Table.AddColumn(Sourse, "Объем", each if [Column1] = "Со значениями" then Text.End ([Column2], 4) else null)
UPD В принципе получилось в два шага - извлечение крайних правых четырех символов из всех строк с изменением свойства на числовые (где текст появилась ошибка), а потом добавлением еще одного столбца с условием что значение больше нуля (try ... otherwise). Но хотелось бы правильнее.
Изменено: mitox - 08.04.2020 20:00:17
 
Цитата
mitox написал:
Как можно решить задачу?
Значение, которое необходимо вытащить всегда последнее?

Можно воспользоваться функцией разделить столбец по разделителю, выбираем "пробел" и ,"Самый правый разделитель".
 
Якубович, Точно. Не обращал внимание. Но останется необходимость подчищать извлеченный текст. Все равно - спасибо.
 
Цитата
mitox написал:
необходимость подчищать извлеченный текст
Можно применить на столбец формат десятичное число и использовать оператор ЕСЛИОШИБКА для PQ:
Код
=try <operation> otherwise <alternate result> (например, null)

После этого необходимо скрыть пустые значения, и останутся только данные с цифрами.

 
Якубович, Да, я так и сделал
Цитата
mitox написал:
(try ... otherwise)
 
а файлика на поиграться не будет?
Соблюдение правил форума не освобождает от модераторского произвола
 
Якубович, вы в своей теме тоже без файла ждете помощи?
 
buchlotnik, Я хотел уже по взрослому - без файла))) Завтра выложу.

Я понимаю что выделив крайнее правое значение, к нему нужно применить проверку на свойство или содержание.

Если буквы - null , если цифры - оставить значение. Какой функцией решается данная задача? Хочу разобраться в этой теме.
 
Цитата
mitox написал:
Какой функцией решается данная задача?
скорее оператором if then else - без примера неинтересно
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik, Завтра утром выложу.

Upd Нашел функцию - Text.Trim
Изменено: mitox - 08.04.2020 21:40:52
 
Михаил Л, там же вопрос "методологический" :)  
 
buchlotnik, Выкладываю свое решение
Код
let
    Sourse = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Add = Table.AddColumn(Sourse , "Объем_", each if [Column1] = "Группа1" then [Column2] else null),
    Split = Table.SplitColumn(Add, "Объем_", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, true), {"Объем.1", "Объем"}),
    Transform = Table.TransformColumns(Split,{{"Объем", each Text.Trim (_, {"(", ")" , "а".."я", "А".."Я", "ё", "+", "-", "/", " "}), type text}}),
    Types = Table.TransformColumnTypes(Transform,{{"Объем", type number}}),
    Remove = Table.RemoveColumns(Types,{"Объем.1"})
in
    Remove


Upd Но оно не будет работать если в Column2 будут по каким то причинам появляться знаки в последней группе текста перед пробелом не указанные в списке, или необходимые данные получат размерность через пробел. Также работать будет только после группировки по "Группа1"

UPD Приложил файл
Изменено: mitox - 09.04.2020 09:45:12
 
Цитата
mitox написал:
по каким то причинам появляться знаки
Пробелы удалили - уже хорошо :)  
 
Михаил Л, Плохо что этот список ( "(", ")" , "а".."я", "А".."Я", "ё", "+", "-", "/", " " ) может быть длинным. Понятно что его можно вынести в справочник. Но как то тяжеловато получается.
 
Цитата
mitox написал:
как то тяжеловато получается
Вы же хотели по взрослому :)  
 
Михаил Л, Помню. Сколько смог сделал )))
 
Цитата
mitox написал:
Сколько смог сделал )))
А пример где? :D
Код
let
    Sourse = #table(1,{{"ghgfh1.0"},{"l;kjkj2.5"},{"kljh0.5"}}),
    Transform = Table.TransformColumns(Sourse,{{"Column1", each Text.Replace(Text.Remove(_, {"(", ")" , "a".."z", "A".."Z",";"}),".",",")}}),
    Types = Table.TransformColumnTypes(Transform,{{"Column1", type number}})
in
    Types
 
Цитата
Михаил Л написал:
А пример где?
Я его сделал. Ток почему то не приложил. Обновил выше.

UPD И здесь его приложу
Изменено: mitox - 09.04.2020 09:52:07
 
Михаил Л, Спасибо Text.Remove работает как и Text.Trim (в первом нужно указать справочник замены, во втором при отсутствии справочника удаляет только пробелы).
 
Вариант
Код
let
    from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    fn=(t)=> [  a = Text.AfterDelimiter(Text.From(t, "ru-RU"), " ", {0, RelativePosition.FromEnd}),
                b = Text.ToList(a),
                c = List.Select(b, each List.ContainsAny({_},{"0".."9"}&{","})),
                d = Number.From(Text.Combine(c))][d],
    add = Table.AddColumn(from, "Объем", each if [Column1] = "Группа1" then fn([Column2]) else null)
in
    add
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik, Да. Спасибо - то что нужно. Буду изучать.
 
Товарищи, а почему бы не использовать
Код
Text.Select( "text", {".","0".."9"})
Вот горшок пустой, он предмет простой...
 
PooHkrd, да, как-то про текстовый я и забыл, только зпт добавить:
Код
let
    from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    fn=(t)=> [  a = Text.AfterDelimiter(Text.From(t, "ru-RU"), " ", {0, RelativePosition.FromEnd}),
                b = Number.From(Text.Select(a, {".",",","0".."9"}))][b],
    add = Table.AddColumn(from, "Объем", each if [Column1] = "Группа1" then fn([Column2]) else null)
in
    add
Соблюдение правил форума не освобождает от модераторского произвола
 
Раз сделал - тоже выложу
Код
// Таблица1
let
    Sourse = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Added Custom" = Table.AddColumn(Sourse, "Пользовательская", each [
    a=Text.Split(_[Column2]," "), c={"0".."9"},
    b=List.Transform(a, each Text.PositionOfAny(_, c)),d=Table.FromColumns({a,b}),
    e=List.Last(Table.SelectRows(d, each [Column2] >= 0)[Column1]),
    f=Number.From(Text.Remove(e, {"(", ")" , "а".."я", "А".."Я",";", "_"}))][f] )
in
    #"Added Custom"
 
Спасибо (!)
 
Михаил Л, ваш список нужно дополнить еще буквами "ё", "Ё", т.к. в отличие от латиницы они не входят в диапазоны "а".."я", "А".."Я"
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
в отличие от латиницы они не входят в диапазоны "а".."я", "А".."Я"
Об этом я знаю.
Скопировал из #17 часть кода и не стал заострять внимание на редко используемых буквах
 
еще вариант
Код
let
    Sourse = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    LastNum = Table.AddColumn(Sourse, "LastNum", each 
        [a=Text.ToBinary(Text.From([Column2]),0),
         b=List.RemoveLastN(Binary.ToList(a),(_)=>not((_>47 and _<58) or _=44)),
         c=#binary(List.LastN(b,(_)=>(_>47 and _<58) or _=44)),
         d=Number.From(Text.FromBinary(c))][d], 
        type number
    )
in
    LastNum
Изменено: Андрей Лящук - 09.04.2020 12:41:33
 
Немного оффтоп: коллеги, а скажите, плз, в чем цимес использования
Код
[a=2, b=a+1][b]
перед
Код
let a = 2 in a+1
Получается не короче, не нагляднее...
F1 творит чудеса
 
Максим Зеленский, это вкусовщина, я думаю. Лично мне так удобнее писать с отступами, когда переменных в записи будет 2 и более штук. Если переменная одна, то пишу с let in в одну строку, если переменных много то пишу в виде записи, каждую с новой строки, а т.к. уже привык для let и in выделять отдельные строки, а в форме записи строчек получается по-меньше при оформлении. Как-то так.
Изменено: PooHkrd - 09.04.2020 13:03:47
Вот горшок пустой, он предмет простой...
Страницы: 1 2 След.
Наверх