excel - 如何将excel列拆分为多行
问题描述
我从活动注册表中获取导出,其中每个订单(行)包含订单日期、购买价格和 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"
推荐阅读
- javascript - 如何在动作创建函数中更改组件的内部状态属性
- python - python selenium 在点不可点击
- json - 至少其中一个属性在 json 模式中应具有特定值
- c - Atmega328p 中的 SPI COMM
- ios - 如何将数据库放入iOS App的沙盒区域并访问路径?
- r - R:在字符串中显示匹配的特殊字符
- desire2learn - 学生科目和课程完成
- css - 为什么 Firefox 和 Chrome 在 flex 子项中呈现这个可滚动区域的方式不同,我如何让 Firefox 像 Chrome 一样工作?
- java - POST 请求不适用于 Python,但可以使用 Java
- angular - 从 asp.net 核心 web api 返回存储在数据库中的多个图像,以显示在轮播/滚动视图中