Страницы: 1
RSS
PQ: Разбивка списка без "явного" разделителя
 
Всем привет!
Нужно разбить данные из списка на несколько столбцов, вроде легко...
Но отсутствует хоть какой то разделитель (только пробелы), можно "зацепится" только за числа в самом тексте.
Есть идеи как это реализовать?
В жизни нет ничего невозможного! Есть только недостаток знаний и умений.
 
Это совсем не PQ, но возможно идеи из этой статьи Вам покажутся интересными:
Анализ текста регулярными выражениями (RegExp) в Excel
 
IKor, Спасибо, я в курсе по регуляркам, но решение требуется именно в PQ
В жизни нет ничего невозможного! Есть только недостаток знаний и умений.
 

не уверен, что на 100% будет работать корректно

с учетом "придирок" от Дмитрий(The_Prist) Щербаков))

Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Столбец1", type text}}),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Измененный тип", "Пользовательская", each Text.PositionOfAny([Столбец1],{"0".."9"})),
    #"Добавлен пользовательский объект1" = Table.AddColumn(#"Добавлен пользовательский объект", "Пользовательская.1", each Text.Middle([Столбец1],0,[Пользовательская])),
    #"Добавлен пользовательский объект2" = Table.AddColumn(#"Добавлен пользовательский объект1", "Пользовательская.2", each Text.Middle([Столбец1],[Пользовательская])),
    #"Разделить столбец по разделителю" = Table.SplitColumn(#"Добавлен пользовательский объект2", "Пользовательская.2", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, false), {"Пользовательская.2.1", "Пользовательская.2.2"}),
    #"Измененный тип1" = Table.TransformColumnTypes(#"Разделить столбец по разделителю",{{"Пользовательская.2.1", type text}, {"Пользовательская.2.2", type text}})
in
    #"Измененный тип1"
Изменено: mechanix 85 - 31.08.2021 10:50:40
 
Думаю, можно идти от пробелов с конца текста.
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Столбец1", type text}}),
    #"Вставленный текст после разделителя" = Table.AddColumn(#"Измененный тип", "Цвет", each Text.AfterDelimiter([Столбец1], " ", {0, RelativePosition.FromEnd}), type text),
    #"Вставленный текст между разделителями" = Table.AddColumn(#"Вставленный текст после разделителя", "Размер", each Text.BetweenDelimiters([Столбец1], " ", " ", {1, RelativePosition.FromEnd}, 0), type text),
    #"Вставленный текст перед разделителем" = Table.AddColumn(#"Вставленный текст между разделителями", "Текст перед разделителем", each Text.BeforeDelimiter([Столбец1], " ", {1, RelativePosition.FromEnd}), type text),
    #"Другие удаленные столбцы" = Table.SelectColumns(#"Вставленный текст перед разделителем",{"Текст перед разделителем", "Размер", "Цвет"})
in
    #"Другие удаленные столбцы"
Изменено: Andrey_S - 31.08.2021 10:30:08
 
Вот так еще можно попробовать:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Столбец1", type text}}),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Измененный тип", "Пользовательский", each Text.Middle([Столбец1], 0, Text.PositionOfAny([Столбец1],{"0".."9"}))),
    #"Добавлен пользовательский объект1" = Table.AddColumn(#"Добавлен пользовательский объект", "Числа", each Text.Middle([Столбец1], Text.Length([Пользовательский]), Text.PositionOfAny([Столбец1],{"0".."9"},Occurrence.Last)-Text.Length([Пользовательский])+1)),
    #"Добавлен пользовательский объект2" = Table.AddColumn(#"Добавлен пользовательский объект1", "Пользовательский.1", each Text.Middle([Столбец1], Text.Length([Пользовательский])+Text.Length([Числа]), Text.PositionOfAny([Столбец1],{"0".."9"},Occurrence.Last)+1)),
    #"Обрезанный текст" = Table.TransformColumns(#"Добавлен пользовательский объект2",{{"Пользовательский.1", Text.Trim, type text}, {"Числа", Text.Trim, type text}, {"Пользовательский", Text.Trim, type text}})
in
    #"Обрезанный текст"
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
mechanix 85,Благодарю, именно то, что нужно.
Я пытался реализовать поиск через {"0".."9"}, но не получалось. А оказывается все просто:)
В жизни нет ничего невозможного! Есть только недостаток знаний и умений.
 
Понимаю, что это придирки, но оба вариант(Andrey_S и mechanix 85) дадут сбой, если строка будет такого вида:
Игорь Стерлитамак Kweichow Moutai 6265 синий и красный
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Andrey_S,я указал в самом файле, что это не вариант.

Дмитрий(The_Prist) Щербаков, Да, Дмитрий, спасибо! У меня загвоздка была в поиске через значения.
В жизни нет ничего невозможного! Есть только недостаток знаний и умений.
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Occurrence.Last
в моем случае (в оригинале) не рабочий вариант, т.к. встречаются такие вводные:
Игорь Стерлитамак Kweichow Moutai 6265 синий и красный 23
без претензий, просто уточняю.
В жизни нет ничего невозможного! Есть только недостаток знаний и умений.
 
Александр, а так?
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Столбец1", type text}}),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Измененный тип", "Пользовательская", each Text.PositionOfAny([Столбец1],{"0".."9"})),
    #"Добавлен пользовательский объект1" = Table.AddColumn(#"Добавлен пользовательский объект", "Пользовательская.1", each Text.Middle([Столбец1],0,[Пользовательская])),
    #"Добавлен пользовательский объект2" = Table.AddColumn(#"Добавлен пользовательский объект1", "Пользовательская.2", each Text.Middle([Столбец1],[Пользовательская])),
    #"Разделить столбец по разделителю" = Table.SplitColumn(#"Добавлен пользовательский объект2", "Пользовательская.2", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, false), {"Пользовательская.2.1", "Пользовательская.2.2"}),
    #"Измененный тип1" = Table.TransformColumnTypes(#"Разделить столбец по разделителю",{{"Пользовательская.2.1", type text}, {"Пользовательская.2.2", type text}})
in
    #"Измененный тип1"
 
Цитата
Александр написал:
т.к. встречаются такие вводные
тогда проблема еще глобальнее - изначально Вы написали
Цитата
Александр написал:
можно "зацепится" только за числа в самом тексте
а по сути это тоже не вариант. А что делать, если числа встречаются даже на два и не три раза? Как тогда должен выглядеть результат?
Вы бы побольше исходных данных приложили и вариант как они должны разбиться - тогда можно и подумать что-то. Без обид, но сейчас как-то не очень охота время тратить на алгоритмы, когда есть предположение, что далее возникнут еще "если"
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, я в файле-примере указал, что правее еще имеются данные. Думал, что это сосредоточит всех искать поиск через начало списка.
В любом случае, вопрос для меня решен через "Text.PositionOfAny".
Всех благодарю за активную помощь!

З.Ы. Поиск числа ограничил до первого "пробела"
Код
Text.Middle([Список], Text.PositionOfAny([Список],{"0".."9"}), Text.PositionOfAny(Text.Middle([Список], Text.Length([Препарат])),{" "}))
В жизни нет ничего невозможного! Есть только недостаток знаний и умений.
 
Цитата
Александр написал:
указал, что правее еще имеются данные
да. Но качество данных тоже не последняя вещь :) Ведь изначально Вы не указали, что там так же могут быть числа, которые можно было считать разделителем, с Ваших же слов.
Но раз задача решена, то и обсуждение по сути дальнейшее ни о чем  ;)  
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Вариант кода для обладателей О365 либо для PBI. А чо , они тоже люди. Сделал почти кнопками.
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
    #"Split Column by Character Transition" = Table.SplitColumn(
        Source, 
        "Столбец1", 
        Splitter.SplitTextByCharacterTransition((c) => not List.Contains({"0".."9",",","-"}, c), {"0".."9"}), 
        {"буквы", "не буквы"}),
    #"Split Column by Character Transition1" = Table.SplitColumn(
        #"Split Column by Character Transition", 
        "не буквы", 
        Splitter.SplitTextByCharacterTransition({"0".."9"}, (c) => not List.Contains({"0".."9",",","-"}, c)), 
        {"не буквы", "опять буквы"})
in
    #"Split Column by Character Transition1"
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
для обладателей О365
все смотрю на цены и размышляю о приобретении...
В жизни нет ничего невозможного! Есть только недостаток знаний и умений.
 
Александр, pbi бесплатный, если для себя.
Изменено: PooHkrd - 01.09.2021 01:13:31
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх