如何用Power Query导入CSV并按需映射列(特殊行适配)
问题
导入CSV文件到Excel时,90%的行包含5个字段,但部分行是6个字段。当前Power Query代码按固定5列映射,导致这些6字段行的列数据错位。需要实现:当第2字段为AK Interactive且第4字段为3rd Generation 17ml时,调整列映射逻辑,让最终所有行都匹配指定的目标列格式。
解决方案
修改Power Query代码,先动态保留每行的原始字段数量,再根据条件调整字段结构,具体代码如下:
let // 替换为你的CSV文件路径 Source = Csv.Document(File.Contents("C:\你的文件路径.csv"), [Delimiter=",", Encoding=1252, QuoteStyle=QuoteStyle.Csv]), // 将每行转换为列表,保留原始字段数 RowsAsLists = Table.TransformColumns(Source, {{Column1, each Text.Split(_, ",")}}), // 自定义调整逻辑函数 AdjustFieldStructure = (rowList as list) as list => let RowLength = List.Count(rowList), // 判断是否为需要调整的特殊行 IsSpecialRow = RowLength = 6 and rowList{1} = "AK Interactive" and rowList{3} = "3rd Generation 17ml", // 按目标格式调整字段:示例将第5个字段合并到第4列,可根据需求修改 AdjustedRow = if IsSpecialRow then { rowList{0}, // 第1列(原第1字段) rowList{1}, // 第2列(原第2字段) rowList{2}, // 第3列(原第3字段) rowList{3} & " - " & rowList{4}, // 第4列(合并原第4、5字段) rowList{5} // 第5列(原第6字段) } else if RowLength = 5 then rowList // 正常5字段行直接保留 else rowList // 其他异常行可自定义处理(如标记错误) in AdjustedRow, // 应用调整逻辑到所有行 ApplyAdjustments = Table.TransformColumns(RowsAsLists, {{Column1, AdjustFieldStructure}}), // 转换为表格并设置目标列名 FinalTable = Table.FromList( ApplyAdjustments[Column1], Splitter.SplitByNothing(), {"目标列1", "目标列2", "目标列3", "目标列4", "目标列5"} ), // 按需设置各列数据类型 SetDataTypes = Table.TransformColumnTypes( FinalTable, { {"目标列1", type text}, {"目标列2", type text}, {"目标列3", type text}, {"目标列4", type text}, {"目标列5", Currency.Type} } ) in SetDataTypes
关键逻辑说明
- RowsAsLists:将每行CSV文本拆分为列表,避免固定列数提前截断或错位
- AdjustFieldStructure函数:核心判断与调整逻辑
- 先判断行是否为6字段且符合指定的品牌、产品类型条件
- 按照目标格式调整字段:示例中把额外的第5字段合并到第4字段,你可以根据实际需求修改(比如调整字段顺序、单独拆分到新列等)
- FinalTable:将调整后的列表转换为表格,设置目标列名
- SetDataTypes:根据业务需求设置各列的数据类型(如价格设为货币型)
内容的提问来源于stack exchange,提问作者justinf
相关产品推荐
相关产品推荐

