[英]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 初學者發布,我不知道這種方法或發布的第一種方法是否更有效和/或可擴展
它仍在進行中,因為我在某些步驟中固定了列名,並且我希望最終使其更加通用。 但是這個重復列組的問題時常出現。
源數據
這種方法:
注意:您需要將代碼中的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.