如何让Power Query M的Csv.Document动态识别目标表头行的列数?
解决CSV动态适配列数的Power Query M脚本方案
要解决第一行列数不足导致数据截断的问题,核心思路是先获取第15行的列数,再以此作为参数导入CSV,具体脚本如下:
let // 读取文件所有内容为文本,按行拆分 FileText = Text.FromBinary(File.Contents(Filepath)), RowsList = Text.Split(FileText, "#(cr)#(lf)"), // 若CSV是Unix换行格式,替换为#(lf) // 获取第15行(索引14,从0开始计数),拆分得到列数 HeaderRow = List.Skip(RowsList, 14){0}, ColumnCount = List.Count(Text.Split(HeaderRow, ",")), // 用动态获取的列数导入CSV Source = Csv.Document(File.Contents(Filepath), [Delimiter = ",", QuoteStyle = QuoteStyle.None, Columns = ColumnCount]), #"Removed Top Rows" = Table.Skip(Source, 14), #"Promoted Headers" = Table.PromoteHeaders(#"Removed Top Rows", [PromoteAllScalars=true]) in #"Promoted Headers"
关键说明:
- 换行符需匹配实际文件格式:Windows系统导出的CSV常用
#(cr)#(lf),Unix/Linux系统则用#(lf),需根据情况调整。 - 分隔符要保持一致:如果你的CSV使用分号或其他分隔符,需同步修改
Text.Split(HeaderRow, ",")和Csv.Document里的Delimiter参数。 - 若处理超大文件,可优化为一次性读取文本后直接转换为表格,避免两次读取文件,但常规场景下当前方案足够高效且易维护。
内容的提问来源于stack exchange,提问作者drumguy631
相关产品推荐
相关产品推荐

