Страницы: 1
RSS
Разделение столбца по каждому второму разделителю
 
Здравствуйте, уважаемые знатоки Power Query и я зыка M. Возникла задача, с которой пока не знаю как справиться, прошу вашей помощи. Имею столбец с текстовой строкой в которой есть разделители (допустим это символ "|"). Необходимо разделить данный текст на строки по каждому Второму разделителю.
Например была строка:
TEG1|Data 1|TEG2|Data 2|TEG3|Data 3
Хочу получить:
TEG1|Data 1
TEG2|Data 2
TEG3|Data 3.
Сначала надеялся, что есть готовая функция в разделе Splitter Functions, но её нет. Затем пришла в голову мысль превратить текст в список, а из него сделать список, который бы содержал положение всех моих разделителей ("|"). Затем убрать каждый чётный элемент, и разделить исходный текст по позиции. Но беда в том, что я не знаю как создать список, который содержит позиции Всех моих разделителей. Функции типа List.PositionOf не подходят, так как возвращают положение первого вхождения.
В приложенном файле есть исходная таблица, и желаемый результат
Изменено: Machestro - 31.05.2019 08:07:59
 
Machestro, добрый день!

Если строка небольшой длины (из 3-10) частей как у вас в примере, можно формулой подготовить ее для последующего разделения, заменив каждый 2й символ на другой:
=ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(Таблица1[Текст];"|";"&";2);"|";"&";3);"|";"&";4);"|";"&";5)
 
Цитата
Arturus написал:
Если строка небольшой длины
Строка может быть любой длины
 
Если извлекаемый текст одной длины:
=ПСТР(Таблица1[Текст];(СТРОКА(G1)-1)*12+1;11)
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
.
 
artyrH, Ваше решение отлично подходит, воспользуюсь им. Благодарю!
 
Доброе время суток.
Ещё одно лобовое решение.
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    test = Table.TransformColumns(Source, {"Текст", (item) =>
    let
        items = Text.Split(item, "|"),
        ids = {0..Number.IntegerDivide(List.Count(items), 2) - 1}
    in
        List.Transform(ids, each items{2* _} & "|" & items{2 * _ + 1})
    }),
    #"Expanded {0}" = Table.ExpandListColumn(test, "Текст")
in
    #"Expanded {0}"
 
до кучи
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Split  = Table.TransformColumns(Source,{{"Текст", each List.Transform(List.Split(Text.Split(_,"|"),2),each Text.Combine(_,"|"))}}),
    Expand = Table.ExpandListColumn(Split, "Текст")
in
    Expand
 
Андрей Лящук, У вас очень компактный вариант получился. К сожалению в версии Excel 2016 в PQ нет функции List.Split, но ваш вариант работает в Power BI
 
Андрей Лящук, коллега, спасибо! Упустил этот момент.
Цитата
Machestro написал:
в версии Excel 2016 в PQ нет функции List.Split
Кто вам сказал такую глупость? Посоветуйте ему чаще обновляться, и жизнь наладится. :)
 
Цитата
Андрей VG написал:
Кто вам сказал такую глупость
Увы, это личный опыт! Работаю на крупном предприятии, и не могу просто попросить обновить Excel. Какая была версия установлена изначально, такой и пользуемся.
Изменено: Machestro - 31.05.2019 09:57:00
 
Андрей Лящук, у меня другая проблемка. в окне при разворачивании нет данных(пустые строки), но при выгрузке в Excel данные есть
как быть, если надо в PQ добавить еще шаги обработки?
 
только так получилось  8-0
Код
let
    Source  = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Split   = Table.TransformColumns(Source,{{"Текст", each List.Transform(List.Split(Text.Split(_,"|"),2),each Text.Combine(_,"|"))}}),
    Custom1 = Table.RemoveLastN(Table.Transpose(Table.FromRows({List.Combine(Split[Текст])})))
in
    Custom1
 
Machestro, У меня такая же проблема была, почитайте вот тут, тут, и тут. если прям совсем заблокано в винде всё от пользователя (что врятли).
То подойти с местным айтишникам, с нужными продуктами из магазина и попросить чтобы они запустили нужные файлики от имени администратора.
 
Цитата
Андрей Лящук написал:
так получилось
данные у списка видны
Код
Table.ExpandListColumn(Split,"Текст")[Текст]
 
Исключительно на правах идеи:
- можно сначала разделить данные по каждому разделителю
- а затем результат склеивать по-парно.
 
IKor, отличная идея!!!
 
Цитата
IKor написал:
сначала разделить данные по каждому разделителю- а затем результат склеивать по-парно
А у тёзки и у меня какая-то другая идея!? :)
 
Андрей Лящук, не очень понял, а Table.RemoveLastN() тут зачем?
Код
Custom1 = Table.RemoveLastN(Table.Transpose(Table.FromRows({List.Combine(Split[Текст])})))

И главное зачем так сложно? ИМХО если без Экспанда, то так проще:
Код
= Table.FromList( List.Combine( Split[Текст] ) )
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх