Страницы: 1
RSS
PQ Добавление столбца если данные содержат текст, по справочнику, по условию
 
Добрый день!
Есть маршрутные листы, в которых прописан маршрут. Например, "Клин - Волоколамск - Санкт-Петербург - Волоколамск". Для этих маршрутов необходимо добавить направление, т.е. если в маршруте содержится город Москва или Волоколамск то это направление Мск.
Проблема заключается в том, что в одном и том же маршруте может быть два "ключевых" города. По условию, сначала проверяем на наличие Москва или Волоколамск, затем на наличие Санкт-Петербург, на последок проверяем Ростов-на-Дону. Если есть и Москва и Питер, то ставим Мск. Если и Питер и Ростов, то Спб.
На форуме нашел решение через List.Accumulate. Добавил три справочника, и решаю через три условных столбца.
Подскажите, пожалуйста, возможно ли более простое решение данного вопроса?
 
del
Изменено: buchlotnik - 23.08.2021 15:25:14
Соблюдение правил форума не освобождает от модераторского произвола
 
Я бы не заморачивался
Код
= Table.AddColumn(Источник, "направление", each 
     if Text.Contains([Маршрут строка], "Волоколамск") or Text.Contains([Маршрут строка], "Москва") 
     then "Мск" 
     else 
          if Text.Contains([Маршрут строка], "Санкт-Петербург")
          then "Спб" 
          else 
               if Text.Contains([Маршрут строка], "Ростов-на-Дону") 
               then "Рдн" 
               else null
                     )
 
Цитата
Михаил Л написал:
Я бы не заморачивался
ну на трех объектах-то да, правда со временем их обычно становится двадцать три, сто двадцать три и т.д.  :)
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik, Спасибо! Буду разбираться. При моем уровне познаний, мне пока трудно дается написание функций. Буду очень признателен, если поясните суть написанного в общих чертах))
 
Цитата
buchlotnik написал:
сто двадцать три и т.д
Вы правы, их намного больше чем 3
 
del
Изменено: buchlotnik - 23.08.2021 15:25:28
Соблюдение правил форума не освобождает от модераторского произвола
 
Спасибо за подробный ответ!
 
Цитата
buchlotnik написал:
ну на трех объектах-то да, правда со временем их обычно становится двадцать три, сто двадцать три и т.д.
ради интереса:
замерил ваш код на 525 000 строках
и "простой"
Код
= Table.AddColumn(Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content], "Пользовательский", each if Text.Contains([Маршрут строка], "Волоколамск") or Text.Contains([Маршрут строка], "Москва") then "Мск" else if Text.Contains([Маршрут строка], "Санкт-Петербург") then "СПб" else if Text.Contains([Маршрут строка], "Ростов-на-Дону") then "РнД" else null)

"простой" работает быстрее
сам файл
Изменено: Антон - 21.12.2020 11:11:05
 
del
Изменено: buchlotnik - 23.08.2021 15:25:47
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik,
мне было просто интересно посмотреть, что работает быстрее, когда имеет место быть большое кол-во замен, то конечно же if then не подходит, тут вопросов нет.
последний вариант интересен, отлично.
но по быстродействию все же именно "простой" вариант более быстрый, по крайне мере у меня. наибольшее кол-во времени тратиться на вывод строк в excel
 
Всем доброго дня.
Цитата
Антон написал:
мне было просто интересно посмотреть, что работает быстрее
Ну, раз интересно, погоняйте тогда такой вариант (внимание, порядок строк в справочнике Таблица 3 определяет приоритет направлений):
Код
let
    Dir = Table.AddIndexColumn( Excel.CurrentWorkbook(){[Name="Таблица3"]}[Content], "Индекс", 0, 1 ),
    MergedColumns = Table.CombineColumns( Dir,{"Направление", "Индекс"}, (x)=>x,"Направление"),
    AddedDir = Table.AddColumn( 
        Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content], 
        "Направление", 
        let d = Table.ToRows( MergedColumns[[Город], [Направление]] ) 
        in each Table.Min( Table.FromRows( List.Select( List.ReplaceMatchingItems( Text.Split( [Маршрут строка], " - " ), d ), each _ is list ) ), {"Column2"} )[Column1], Text.Type )
in
    AddedDir

Цитата
buchlotnik написал:
let    f=(x)=>Excel.CurrentWorkbook(){[Name=x]}[Content],
Михаил, если мне не изменяет мой склероз, тут публиковали тему, когда возникал конфликт обращений при таком функциональном подходе при выковыривании таблицы из памяти и последующем неоднократном к ней обращении. Тогда до источника глюка так и не добрались, но загон таблицы в отдельную переменную и буфер помог. Тем не менее себе поставил зарубку, что лучше ну его на фиг. Так что будьте бдительны.
Изменено: PooHkrd - 21.12.2020 15:08:52
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
погоняйте тогда такой вариант
погонял
результат - очень и очень долго - обработка 400 строк примерно 1 секунда
 
Цитата
PooHkrd написал:
Так что будьте бдительны
PooHkrd, приветствую. Странно, не замечал проблем ранее, но если возникнет проблема - по крайней мере буду знать потенциальный источник багов, спасибо.
Соблюдение правил форума не освобождает от модераторского произвола
Страницы: 1
Наверх