簡體   English   中英

如何將 excel 列拆分為多行

[英]How to split excel columns into multiple rows

我從活動注冊表中獲取導出,其中每個訂單(行)包含訂單日期、購買價格和 1-4 個注冊人的信息。 每個注冊人都有名字、姓氏和出生日期的列。 我需要的是拆分這些行,以便每個人都在他們自己的行上,第一行,最后一個和 DOB 在行上,理想情況下與其他訂單信息一起復制。

這可能會令人困惑,所以我有導出表格的模型日期,以及我想將它們轉換成的表格。

我得到了什么: https://drive.google.com/file/d/1xt64Re2CTlbQnHuRy1dQaFeNV5OmETfW/view?usp=sharing

我想要什么: https://drive.google.com/file/d/156WmiQ4Tx4JGB5FYLTqHBuVmJqi20pRZ/view?usp=sharing

我發現本教程似乎非常接近我想要使用 Excel Power Query 的內容,但它描述了當多個項目在一個用逗號分隔的列中時的方法。 我的情況有點不同,我無法讓它發揮作用。

有任何想法嗎?

當加載到范圍Table1中時,PowerQuery 下面適用於您擁有的示例數據集

為任意數量的 First/Last/DOB 列集動態編寫; 你有 4 個,這可以處理任意數量的

粘貼到主頁...高級編輯器...

有點冗長以分開步驟並使其可見

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Order Date", type date}}),

// Get names of all First, Last and DOB fields
ColumnsToCombine1 = List.Select(Table.ColumnNames(#"Changed Type"), each Text.Contains(_, "(First)")),
ColumnsToCombine2 = List.Select(Table.ColumnNames(#"Changed Type"), each Text.Contains(_, "(Last)")),
ColumnsToCombine3 = List.Select(Table.ColumnNames(#"Changed Type"), each Text.Contains(_, "DOB")),

//Convert to Text, so we can merge columns; for date fields, convert to date first
#"Changed Type1" = Table.TransformColumnTypes(#"Changed Type", (List.Transform(ColumnsToCombine3 ,each {_,type date}))),
#"Changed Type2" = Table.TransformColumnTypes (#"Changed Type1",List.Transform(Table.ColumnNames(#"Changed Type1"), each {_, type text})),

// convert all First, Last and DOB fields into three comma separated columns
#"Combined1" = Table.AddColumn(#"Changed Type2" , "First", each Text.Combine(Record.FieldValues(Record.SelectFields(_,ColumnsToCombine1)),", ")),
#"Combined2" = Table.AddColumn(#"Combined1", "Last", each Text.Combine(Record.FieldValues(Record.SelectFields(_,ColumnsToCombine2)),", ")),
#"Combined3" = Table.AddColumn(#"Combined2", "DOB", each Text.Combine(Record.FieldValues(Record.SelectFields(_,ColumnsToCombine3)),", ")),

#"Removed Other Columns" = Table.SelectColumns(Combined3,{"ID", "Order Date", "Quantity", "Payment", "First", "Donate", "Last", "DOB"}),

//expand all comma separated columns into their own rows
TableTransform = Table.Combine(List.Transform(List.Transform(Table.ToRecords(#"Removed Other Columns" ), (x) => List.Transform(Record.ToList(x), each Text.Split(_,","))), each Table.FromColumns(_, Table.ColumnNames(#"Removed Other Columns" )))),

#"Reordered Columns" = Table.ReorderColumns(TableTransform,{"ID", "Order Date", "Quantity", "First", "Last", "DOB", "Payment", "Donate"}),
#"Filled Down" = Table.FillDown(#"Reordered Columns",{"ID", "Order Date", "Quantity", "Payment", "Donate"}),
#"Changed Type3" = Table.TransformColumnTypes(#"Filled Down",{{"DOB", type date}, {"Order Date", type date}, {"Payment", type number}, {"Donate", type number}, {"Quantity", type number}, {"First", type text}, {"Last", type text}})
in #"Changed Type3"

替代版本,硬編碼為 4 個表格,基於 Ron 的

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
colNames = Table.ColumnNames(Source),
Table1 = Table.Skip(Table.DemoteHeaders(Table.SelectColumns(Source,List.RemoveMatchingItems(colNames , List.Select(colNames, each Text.Contains(_, "-2") or Text.Contains(_, "-3") or Text.Contains(_, "-4"))))),1),
Table2 = Table.Skip(Table.DemoteHeaders(Table.SelectColumns(Source,List.RemoveMatchingItems(colNames , List.Select(colNames, each Text.Contains(_, "-1") or Text.Contains(_, "-3") or Text.Contains(_, "-4"))))),1),
Table3 = Table.Skip(Table.DemoteHeaders(Table.SelectColumns(Source,List.RemoveMatchingItems(colNames , List.Select(colNames, each Text.Contains(_, "-1") or Text.Contains(_, "-2") or Text.Contains(_, "-4"))))),1),
Table4 = Table.Skip(Table.DemoteHeaders(Table.SelectColumns(Source,List.RemoveMatchingItems(colNames , List.Select(colNames, each Text.Contains(_, "-1") or Text.Contains(_, "-2") or Text.Contains(_, "-3"))))),1),
combined = Table1  & Table2 & Table3 & Table4,
#"Filtered Rows" = Table.SelectRows(combined, each ([Column4] <> null)),
#"Sorted Rows" = Table.Sort(#"Filtered Rows",{{"Column1", Order.Ascending}}),
#"Renamed Columns" = Table.RenameColumns(#"Sorted Rows",{{"Column2", "Order Date"}, {"Column3", "Quantity"}, {"Column4", "First"}, {"Column5", "Last"}, {"Column6", "DOB"}, {"Column7", "Payment"}, {"Column8", "Donate"}, {"Column1", "ID"}}),
#"Changed Type" = Table.TransformColumnTypes(#"Renamed Columns",{{"ID", type number}, {"Quantity", type number}, {"Payment", type number}, {"Donate", type number}, {"Order Date", type date}, {"DOB", type date}, {"First", type text}, {"Last", type text}})
in #"Changed Type"

這是實現此目的的另一種 PQ 方法。

我將它作為 PQ 初學者發布,我不知道這種方法或發布的第一種方法是否更有效和/或可擴展

它仍在進行中,因為我在某些步驟中固定了列名,並且我希望最終使其更加通用。 但是這個重復列組的問題時常出現。

源數據

在此處輸入圖像描述

這種方法:

  • 重新排序列以將“公共列”放在一起,在這種情況下,將是前三個和最后兩個。
  • 降級 header 行並轉置表格
  • 處理第一列,以便創建最終列標題的正確列表。
    • 將此表拆分為多個表,其中
      • 第一個表代表公共列
      • 其他表代表每個重復的列組
  • 將第一個表與其他每個表合並
  • 合並結果表
  • 轉回原始列/行方向,並將第一行提升為標題。
  • 通過刪除空值和排序進行清理
  • 重新排序列,將前三個和后兩個放回原來的位置。

注意:您需要將代碼中的Table1更改為實際的表名,如果它不同

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],

        colNames = Table.ColumnNames(Source),

            commonTableColumnCount = 5,

           colOrder = List.Combine({List.FirstN(colNames,3),List.LastN(colNames,2),List.Range(colNames,3,List.Count(colNames)-commonTableColumnCount)}),

    #"Reordered Columns" = Table.ReorderColumns(Source,colOrder),
    
    //Demote Headers and transpose
    transpose1 = Table.Transpose(Table.DemoteHeaders(#"Reordered Columns")),

    //Split up Column 1 to create multiple matched names
    split = Table.SplitColumn(transpose1, "Column1", Splitter.SplitTextByDelimiter("-", QuoteStyle.Csv), {"Column1", "Column1.1"}),
    #"Split Column by Delimiter" = Table.SplitColumn(split, "Column1.1", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, true), {"Column1.1.1", "Column1.1.2"}),
    #"Removed Columns" = Table.RemoveColumns(#"Split Column by Delimiter",{"Column1.1.1"}),
    #"Merged Columns" = Table.CombineColumns(#"Removed Columns",{"Column1", "Column1.1.2"},Combiner.CombineTextByDelimiter(" ", QuoteStyle.None),"Column1"),

        commonTable = Table.Split(#"Merged Columns",commonTableColumnCount){0},
        record = Table.ToRecords(commonTable),
        
        //repeated tables
            //rem CommonTables Rows and split
            data = Table.Split(Table.RemoveRows(#"Merged Columns",0,commonTableColumnCount),3),

            //insert common rows into each table
            data1 = Table.InsertRows(data{0},0,record),

            //get final order of column names    
                colNames2 = Table.Column(data1,"Column1"),
                finalOrder = List.Combine({List.FirstN(colNames2,3),List.LastN(colNames2,List.Count(colNames2)-commonTableColumnCount), List.Range(colNames2,3,2)}),

            custom1 = List.Transform(data, each Table.InsertRows(_,0,record)),

            //Transpose and combine each Table
            custom2 = List.Transform(custom1, each(Table.PromoteHeaders(Table.Transpose(_),[PromoteAllScalars=true]))),
            
    #"Converted to Table" = Table.FromList(custom2, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    
        #"Expanded Column1" = Table.ExpandTableColumn(#"Converted to Table","Column1",colNames2),

        //need to do this manually
        #"Changed Type" = Table.TransformColumnTypes(#"Expanded Column1",{{"ID ", Int64.Type}, {"Order Date ", type date}, {"Quantity ", Int64.Type}, {"Payment ", Currency.Type}, {"Donate ", Currency.Type}, {"Name (First)", type text}, {"Name (Last)", type text}, {"DOB ", type date}}),

    #"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([#"Name (Last)"] <> null)),

    #"Sorted Rows" = Table.Sort(#"Filtered Rows",{"ID ", Order.Ascending}),

    #"Reordered Columns1" = Table.ReorderColumns(#"Sorted Rows", finalOrder)
in
    #"Reordered Columns1"

重新排序的表

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM