Как нумеровать каждое вхождение подстроки в ячейке в Power Query? - PullRequest
0 голосов
/ 06 марта 2020

Я довольно новичок в Power Query и столкнулся с проблемой, которая беспокоила меня весь день. Я читал несколько веток здесь и в сообществе Power BI, и ни один из них действительно не прояснил мой вопрос, и мой лог c предлагает несколько различных вариантов достижения того, чего я хочу, но мой недостаток опыта блокирует любое решение, которое я пытаюсь предпринять.

Контекст: я создаю базу данных для импорта / экспорта товаров в WooCommerce, eBay и другие каналы; который принимает некоторые вклады (нетехнических пользователей) в Excel и разрабатывает несколько обязательных полей. Одним из них являются имена файлов изображений для каждого продукта.

У меня есть следующие столбцы (в гораздо большей таблице запросов):

| ImageBaseName    | ImageQTY |                    ImageIDs                            |
| product-name.jpg |    3     |   product-name.jpg product-name.jpg product-name.jpg   |
| other-product.jpg|    5     |other-product.jpg other-product.jpg...other-product.jpg | 

И мой желаемый результат будет:

| ImageBaseName    | ImageQTY |                         ImageIDs                             |
| product-name.jpg |    3     |   product-name-1.jpg product-name-2.jpg product-name-3.jpg   |
| other-product.jpg|    5     |other-product-1.jpg other-product-2.jpg...other-product-5.jpg | 

На самом деле мне не нужны два первых столбца, если я получу такие идентификаторы ImageID. Столбец ImageBaseName создается из имени продукта ввода. Столбец ImageQTY является прямым вводом пользователем. Столбец ImageIDs , который я получил до сих пор, использует:

= Table.AddColumn(#"previous step", "ImageIDs", each Text.Trim(Text.Repeat ([ImageBaseName]&" ", [ImageQty]))) 

И вот варианты, которые я рассмотрел до сих пор:

Вариант 1: Text.Combine (Text.Split ImageIDs и (каким-то образом) подсчитывать и нумеровать каждый элемент в списке) и объединять все обратно ... Что, вероятно, начнется так : Text.Combine (Text.Split ,,,

Option 2 Использование пользовательского интерфейса, разделение ImageID на каждый пробел и большое количество столбцов (как Я не знаю, сколько изображений будет у каждого продукта, но, вероятно, не более 12), а затем назначу числовой суффикс для каждого из этих столбцов, а затем соединю их все вместе, но это чертовски грязно.

Вариант 3 Вероятно, существует чистый рассчитанный способ генерирования базовых имен нумерованных изображений на основе числа во втором столбце, а затем прикреплять файл .jpg в конце каждого, но, честно говоря, я не знаю, как.

Я бы хотел, чтобы это было на том же столе, что и я уже имея дело с различными запросами ...

Любая помощь будет принята с удовольствием.

Ответы [ 3 ]

2 голосов
/ 06 марта 2020

Начиная с этого как Таблица1:

enter image description here

Этот код М ...

let
    Source = Table1,
    SplitAndIndexImageIDs = Table.AddColumn(Source, "Custom", each Table.AddIndexColumn(Table.FromColumns({Text.Split([ImageIDs]," ")}),"Index",1)),
    RenameImageIDs = Table.AddColumn(SplitAndIndexImageIDs, "NewImageIDs", each Text.Combine(Table.AddColumn([Custom],"newcolumn",each Text.BeforeDelimiter([Column1], ".") & "-" &Text.From([Index]) & "." & Text.AfterDelimiter([Column1], "."))[newcolumn],", ")),
    #"Removed Other Columns1" = Table.SelectColumns(RenameImageIDs,{"ImageBaseName", "ImageQTY", "NewImageIDs"})
in
    #"Removed Other Columns1"

Должен дать вам этот результат :

enter image description here

1 голос
/ 06 марта 2020

Вот небольшой фрагмент кода "uber step", который вы можете поместить в пользовательский столбец с учетом столбцов ImageBaseName и ImageQty.

Text.Combine
(
    List.Transform
    (
        List.Zip
        (
            {
            List.Repeat({Text.BeforeDelimiter([ImageBaseName], ".", {0, RelativePosition.FromEnd})},[ImageQTY])
            ,
            List.Transform({1..[ImageQTY]}, each "-" & Number.ToText(_) &".")
            ,
            List.Repeat({Text.AfterDelimiter([ImageBaseName], ".", {0, RelativePosition.FromEnd})}, [ImageQTY])
            }
        )
    , each Text.Combine(_)
    )
, " "
)

Сводка: вы создаете компоненты своей строки в виде 3 списков (текст до тип файла, номера от 1 до qty, текст после типа файла). Затем вы используете List.Zip, который объединяет три текстовых компонента в свои собственные списки. Затем мы преобразуем эти списки обратно в один фрагмент текста с помощью List.Transform и Text.Combine.

1 голос
/ 06 марта 2020

Предположим, диапазон Table1 содержит два столбца ImageBaseName и Количество

Добавить столбец ... Индексный столбец ... Щелкните правой кнопкой мыши ImageBaseName Разделить столбец ... По разделителю ... - Пользовательский--, используйте точку в качестве разделителя и разделите в крайнем правом разделителе. Это приведет к удалению суффикса изображения

Добавить столбец ... Пользовательский столбец ... Назовите его Список и используйте формулу = {1 .. [Количество]} который создаст список значений от 1 до Количество

Нажмите двойную стрелку в верхней части нового столбца список и выберите развернуть до новых строк

Нажмите- Выберите список , Количество , ImageBaseName.2 , ImageBaseName.1 столбцы и Преобразовать ... Тип данных ... Текст

Добавить столбец .. Пользовательский столбец .. Назовите его Пользовательский и используйте формулу = [ImageBaseName.1] & "-" & [list] & "." & [ImageBaseName. 2] собрать все части

Щелкните правой кнопкой мыши Индекс Группировать по ... [x] Бази c, Группировать по Индекс , имя нового столбца ImageIDs , количество строк операций

Это сгенерирует код, подобный следующему:

Table.Group(#"Added Custom1", {"Index"}, {{"ImageIDs", each Table.RowCount(_), type number}})

Используйте формулу для изменения формулы, как показано ниже. Он будет объединять строки, используя в качестве разделителя

Table.Group(#"Added Custom1", {"Index"}, {{"ImageIDs", each Text.Combine([Custom], ", "), type text}})

Ниже приведен полный пример кода, который вы можете вставить в Home .. Расширенный редактор ...

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Added Index" = Table.AddIndexColumn(Source, "Index", 0, 1),
#"Split Column by Delimiter" = Table.SplitColumn(#"Added Index", "ImageBaseName", Splitter.SplitTextByEachDelimiter({"."}, QuoteStyle.Csv, true), {"ImageBaseName.1", "ImageBaseName.2"}),
#"Added Custom" = Table.AddColumn(#"Split Column by Delimiter", "list", each {1..[Quantity]}),
#"Expanded list" = Table.ExpandListColumn(#"Added Custom", "list"),
#"Changed Type1" = Table.TransformColumnTypes(#"Expanded list",{{"list", type text}, {"Quantity", type text}, {"ImageBaseName.2", type text}, {"ImageBaseName.1", type text}}),
#"Added Custom1" = Table.AddColumn(#"Changed Type1", "Custom", each [ImageBaseName.1]&"-"&[list]&"."&[ImageBaseName.2]),
#"Grouped Rows" = Table.Group(#"Added Custom1", {"Index"}, {{"ImageIDs", each Text.Combine([Custom], ", "), type text}})
in #"Grouped Rows"

Вероятно, есть много способов чтобы объединить все это в один шаг, но я думал, что покажу части

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...