如何用Power Query拆分多列并保留指定单元格合并状态?
使用Power Query拆分CSV关联列并匹配对应行
原始数据
| Job No. | Date | Reference 1 | Delivery | Miles | Price |
|---|---|---|---|---|---|
| BTM1607 | 03/05/2023 08:00 | GAINSB | Gainsborough Bathrooms Ltd, Walsall, WS9 8SR | 33 | 95 |
| BTM1611 | 02/05/2023 06:00 | 569189 570075 | Mr Owen, Stockport, SK12 1HHMr Michael Hobbs, Bury, BL9 9RE | 128 | 192 |
| BTM1612 | 02/05/2023 07:00 | 570078 569890 | Mrs Gillian Bunce, Sutton Coldfield, B75 6AGMr Richard Scott, Sutton Coldfield, B74 2AL | 35 | 52.5 |
| BTM1613 | 02/05/2023 06:00 | 418719 570246 | D Jiggens, Twickenham, TW2 6PUMrs J Smith, Surbiton, KT6 6QP | 125 | 187.5 |
| BTM1614 | 02/05/2023 06:00 | 569539 570036 | Mr Charles Docherty, London, SE4 2DXMrs Anne Kirby, Dagenham, RM8 2PU | 136 | 204 |
| BTM1615 | 02/05/2023 06:00 | 569435 570025 | Mr Brian Harrison, Stoke-on-Trent, ST1 2ARMrs Shirley Steiert, Ellesmere Port, CH65 6RA | 118 | 177 |
| BTM1616 | 02/05/2023 06:00 | 569249 569172 | Mrs Jill Gardham, Bath, BA2 6PLMr Roy Foster, Shaftesbury, SP7 0PJ | 134 | 201 |
| BTM1617 | 02/05/2023 06:00 | 569903 569287 | Mrs Hill, Bristol, BS15 9UJMrs A Devlin, Cardiff, CF14 1EH | 132 | 198 |
需求
拆分Reference 1(空格分隔)和Delivery(姓名前缀/换行分隔)为多行,使每个参考编号对应一条配送信息,同时保留Job No.、Date、Miles、Price的原始对应关系,避免冗余。目标输出如下:
| Job No. | Date | Reference 1 | Delivery | Miles | Price |
|---|---|---|---|---|---|
| BTM1607 | 03/05/2023 08:00 | GAINSB | Gainsborough Bathrooms Ltd, Walsall, WS9 8SR | 33 | 95 |
| BTM1611 | 02/05/2023 06:00 | 569189 | Mr Owen, Stockport, SK12 1HH | 128 | 192 |
| BTM1611 | 02/05/2023 06:00 | 570075 | Mr Michael Hobbs, Bury, BL9 9RE | 128 | 192 |
| BTM1612 | 02/05/2023 07:00 | 570078 | Mrs Gillian Bunce, Sutton Coldfield, B75 6AG | 35 | 52.5 |
| BTM1612 | 02/05/2023 07:00 | 569890 | Mr Richard Scott, Sutton Coldfield, B74 2AL | 35 | 52.5 |
| BTM1613 | 02/05/2023 06:00 | 418719 | D Jiggens, Twickenham, TW2 6PU | 125 | 187.5 |
| BTM1613 | 02/05/2023 06:00 | 570246 | Mrs J Smith, Surbiton, KT6 6QP | 125 | 187.5 |
| BTM1614 | 02/05/2023 06:00 | 569539 | Mr Charles Docherty, London, SE4 2DX | 136 | 204 |
| BTM1614 | 02/05/2023 06:00 | 570036 | Mrs Anne Kirby, Dagenham, RM8 2PU | 136 | 204 |
解决方案(Power Query)
可视化操作流程
- 导入数据:Excel中点击
数据→获取数据→从文件→从CSV,导入目标文件进入Power Query编辑器。 - 拆分Reference列为行:选中
Reference 1列,转换→拆分列→按分隔符,选择空格,勾选拆分为行,确定。 - 修复Delivery列分隔:选中
Delivery列,转换→替换值,将Mr替换为#lfMr、Mrs替换为#lfMrs;接着拆分列→按分隔符,输入#lf,勾选拆分为行,确定。 - 过滤空值:
开始→行→删除空行,清理拆分后产生的空Delivery条目。 - 分组匹配对应行:
开始→分组依据,分组列选Job No.和Date,新列名设为匹配数据集,操作选所有行,确定。 - 展开关联数据:点击
匹配数据集列的展开按钮,选择添加自定义列,输入以下代码:
展开该自定义列,保留所有需要的字段即可完成整理。= Table.FromRecords( List.Zip({ [Reference 1], [Delivery], List.Repeat({[Miles]{0}}, List.Count([Reference 1])), List.Repeat({[Price]{0}}, List.Count([Reference 1])) }) ,{"Reference 1", "Delivery", "Miles", "Price"} )
完整M代码(直接替换使用)
let Source = Csv.Document(File.Contents("替换为你的CSV文件路径"),[Delimiter=",", Columns=6, Encoding=1252, QuoteStyle=QuoteStyle.None]), #"提升标题" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]), #"更改数据类型" = Table.TransformColumnTypes(#"提升标题",{{"Job No.", type text}, {"Date", type datetime}, {"Reference 1", type text}, {"Delivery", type text}, {"Miles", Int64.Type}, {"Price", type number}}), #"替换Mr分隔符" = Table.ReplaceValue(#"更改数据类型","Mr","#lfMr",Replacer.ReplaceText,{"Delivery"}), #"替换Mrs分隔符" = Table.ReplaceValue(#"替换Mr分隔符","Mrs","#lfMrs",Replacer.ReplaceText,{"Delivery"}), #"拆分Reference为行" = Table.ExpandListColumn(Table.TransformColumns(#"替换Mrs分隔符", {{"Reference 1", Splitter.SplitTextByWhitespace, let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Reference 1"), #"拆分Delivery为行" = Table.ExpandListColumn(Table.TransformColumns(#"拆分Reference为行", {{"Delivery", Splitter.SplitTextByDelimiter("#lf", QuoteStyle.None), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Delivery"), #"过滤空Delivery行" = Table.SelectRows(#"拆分Delivery为行", each [Delivery] <> ""), #"分组匹配数据" = Table.Group(#"过滤空Delivery行", {"Job No.", "Date"}, {{"匹配行", each Table.FromRecords(List.Zip({[Reference 1],[Delivery],List.Repeat({[Miles]{0}},List.Count([Reference 1])),List.Repeat({[Price]{0}},List.Count([Reference 1]))}),{"Reference 1","Delivery","Miles","Price"})}}), #"展开匹配结果" = Table.ExpandTableColumn(#"分组匹配数据", "匹配行", {"Reference 1", "Delivery", "Miles", "Price"}, {"Reference 1", "Delivery", "Miles", "Price"}) in #"展开匹配结果"
内容的提问来源于stack exchange,提问作者Zoltán Farkas
相关产品推荐
相关产品推荐

