Powerquery для разделения столбцов с разделителями на уникальные строки - PullRequest
1 голос
/ 19 апреля 2019

У меня есть электронная таблица, которая выглядит следующим образом:

enter image description here

Я бы хотел, чтобы в конце она выглядела следующим образом:

enter image description here

Я знаю, что могу использовать PowerQuery для разграничения и расширения строк, но это будет работать только в первом столбце.Во второй раз вы увидите много дубликатов.

Любая помощь?

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

При таком подходе вы теряете исходный порядок (при желании вы можете попытаться выполнить повторную сортировку в конце).

Если в какой-то момент вы получите больше столбцов, которые необходимо аналогичным образом разбить, вы можете простодобавьте в список columnsToSplit.

let
    dataFromSheet = Table.FromColumns({{"Cereal Killers", "Acme Products", "Arkham Asylum"}, {"123 Sugar Way", "345 Whoville Place", "Gotham City"}, {"abc@def.com; xyz@abc.com; jkl@mno.com", null, "the.scarecrow@nolan.com; jokesonyou@joker.com"}, {"Tony Tiger; Toucan Sam; Lucky Leprauchan", "W. Coyote; R. Runner; R. Rabbit", null}}, type table [Name=text, Address=text, Emails=nullable text, People=nullable text]),
    columnsToSplit = {"Emails","People"},
    loopOverColumnsToSplit = List.Accumulate(columnsToSplit, #table({}, {}), (tableState, currentColumn) =>
        let
            reduceColumns = Table.SelectColumns(dataFromSheet, {"Name", "Address"} & {currentColumn}),
            dropNullRows = Table.SelectRows(reduceColumns, each Record.Field(_, currentColumn) <> null),
            splitIntoList = Table.TransformColumns(dropNullRows, {{currentColumn, each Text.Split(_, "; "), type list}}),
            expandList = Table.ExpandListColumn(splitIntoList, currentColumn),
            appendToAccumulatedTable = tableState & expandList
        in appendToAccumulatedTable
    )
in
    loopOverColumnsToSplit

Если сохранение порядка важно, то, возможно, попробуйте подход ниже (который может занять немного больше времени, так как имеет несколько дополнительных шагов).

let
    dataFromSheet = Table.FromColumns({{"Cereal Killers", "Acme Products", "Arkham Asylum"}, {"123 Sugar Way", "345 Whoville Place", "Gotham City"}, {"abc@def.com; xyz@abc.com; jkl@mno.com", null, "the.scarecrow@nolan.com; jokesonyou@joker.com"}, {"Tony Tiger; Toucan Sam; Lucky Leprauchan", "W. Coyote; R. Runner; R. Rabbit", null}}, type table [Name=text, Address=text, Emails=nullable text, People=nullable text]),
    columnsToSplit = {"Emails","People"},
    numberOfColumnsToSplit = List.Count(columnsToSplit),
    loopOverColumnsToSplit = List.Accumulate(List.Positions(columnsToSplit), #table({}, {}), (tableState, currentIndex) =>
        let
        currentColumn = columnsToSplit{currentIndex},
        reduceColumns = Table.SelectColumns(dataFromSheet, {"Name", "Address"} & {currentColumn}),
        dropNullRows = Table.SelectRows(reduceColumns, each Record.Field(_, currentColumn) <> null),
        addIndex = Table.AddIndexColumn(dropNullRows, "toSortBy", currentIndex, numberOfColumnsToSplit),
        splitIntoList = Table.TransformColumns(addIndex, {{currentColumn, each Text.Split(_, "; "), type list}}),
        expandList = Table.ExpandListColumn(splitIntoList, currentColumn),
        appendToAccumulatedTable = tableState & expandList
        in appendToAccumulatedTable
    ),
    sorted = Table.Sort(loopOverColumnsToSplit, {"toSortBy", Order.Ascending}),
    dropHelperColumn = Table.RemoveColumns(sorted, {"toSortBy"})
in
    dropHelperColumn

Просто для пояснения: если у вас есть строка, в которой значения в столбцах Emails и People оба равны null, то эта строка не будет присутствовать в выходной таблице.

0 голосов
/ 19 апреля 2019

Я бы просто сделал их отдельно и соединил

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Removed Columns" = Table.RemoveColumns(Source,{"People"}),
#"Filtered Rows" = Table.SelectRows(#"Removed Columns", each ([Emails] <> null)),
SCBD = Table.ExpandListColumn(Table.TransformColumns(#"Filtered Rows", {{"Emails", Splitter.SplitTextByDelimiter(";", QuoteStyle.None)}}), "Emails"),
#"Removed Columns1" = Table.RemoveColumns(Source,{"Emails"}),
#"Filtered Rows1" = Table.SelectRows(#"Removed Columns1", each ([People] <> null)),
SCBD1 = Table.ExpandListColumn(Table.TransformColumns(#"Filtered Rows1", {{"People", Splitter.SplitTextByDelimiter(";", QuoteStyle.None)}}), "People"),
Combined = SCBD  & SCBD1,
#"Sorted Rows" = Table.Sort(Combined,{{"Name", Order.Ascending}, {"Emails", Order.Descending}})
in #"Sorted Rows"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...