如何通过Power Query将CSV中的办公室分组表头转为数据列?
用Power Query将分组表头的CSV转换为结构化数据
操作步骤
导入文本文件到Power Query
- 打开Excel,点击「数据」→「获取数据」→「从文件」→「从文本/CSV」
- 选择目标CSV文件,设置分隔符为「无」,点击「转换数据」进入编辑器
标记办公室名称行
- 添加自定义列「Office」,使用公式判断当前行是否为办公室名称(数据行含分号,表头不含):
if not Text.Contains([Column1], ";") then [Column1] else null
- 添加自定义列「Office」,使用公式判断当前行是否为办公室名称(数据行含分号,表头不含):
向下填充办公室名称
- 选中「Office」列,点击「转换」→「填充」→「向下」,让所有数据行继承上方最近的办公室名称
过滤掉原始表头行
- 选中「Column1」列,筛选出包含分号的行(即数据行),或者直接用M代码:
Table.SelectRows(上一步骤名, each Text.Contains([Column1], ";"))
- 选中「Column1」列,筛选出包含分号的行(即数据行),或者直接用M代码:
合并列(匹配示例输出格式)
- 若要将办公室名称与数据合并为一行,添加自定义列「Combined」,用对齐格式拼接:
Text.PadRight([Office], 8) & " " & [Column1] - 最后删除多余的原始列即可
- 若要将办公室名称与数据合并为一行,添加自定义列「Combined」,用对齐格式拼接:
完整M代码示例
let Source = Csv.Document(File.Contents("替换为你的CSV文件路径"), [Delimiter="", Encoding=1252, QuoteStyle=QuoteStyle.None]), AddOfficeColumn = Table.AddColumn(Source, "Office", each if not Text.Contains([Column1], ";") then [Column1] else null), FillOfficeDown = Table.FillDown(AddOfficeColumn, {"Office"}), FilterDataRows = Table.SelectRows(FillOfficeDown, each Text.Contains([Column1], ";")), MergeColumns = Table.AddColumn(FilterDataRows, "Combined", each Text.PadRight([Office], 8) & " " & [Column1]), RemoveUnusedColumns = Table.RemoveColumns(MergeColumns, {"Column1", "Office"}) in RemoveUnusedColumns
注意事项
- 替换代码中的文件路径为实际路径
- 调整
Text.PadRight的第二个参数(示例为8),可修改办公室名称的对齐宽度 - 若需要结构化拆分数据,可进一步将「Column1」按分号拆分为日期、时间、商品等独立列
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

