Power BI数据流读取含转义逗号大CSV报错,求解决方案
问题描述
尝试导入2.05GB的大型CSV文件到Power BI数据流,该文件含500万行、38列,部分单元格内的逗号通过\,转义。使用以下M语言代码读取时报错DataFormat.Error: The number of items in the list is too large,推测是二进制字符串过大导致:
SourceBinary = Web.Contents("https//link.csv"), SourceText = Text.FromBinary(SourceBinary, TextEncoding.Utf8), CleanText = Text.Replace(SourceText, "\\,", "<COMMA>"), CleanBinary = Text.ToBinary(CleanText, TextEncoding.Utf8), ParsedCSV = Csv.Document(CleanBinary, [Delimiter=",", Columns=38, Encoding=65001, QuoteStyle=QuoteStyle.None]) in ParsedCSV
需要解决该报错,或找到无需读取整个二进制字符串的CSV读取方式,以及处理转义逗号的方法。
解决方案
1. 逐行流式处理,减少内存占用
不要一次性把整个二进制文件转成文本再替换,改用逐行读取处理的方式,降低内存压力:
Source = Web.Contents("https://link.csv"), // 逐行读取二进制内容,避免全量加载 Lines = Lines.FromBinary(Source, null, TextEncoding.Utf8), // 逐行替换转义逗号 CleanLines = List.Transform(Lines, each Text.Replace(_, "\\,", "<COMMA>")), // 将处理后的行重新组合为二进制再解析 CleanBinary = Text.ToBinary(Text.Combine(CleanLines, "#(cr)#(lf)"), TextEncoding.Utf8), ParsedCSV = Csv.Document(CleanBinary, [Delimiter=",", Columns=38, Encoding=65001, QuoteStyle=QuoteStyle.None]), // 批量恢复单元格内的逗号 RestoreCommas = Table.TransformColumns(ParsedCSV, List.Transform(Table.ColumnNames(ParsedCSV), each {_, (x) => if x is text then Text.Replace(x, "<COMMA>", ",") else x})) in RestoreCommas
2. 利用CSV原生转义规则,跳过手动替换
如果CSV的转义格式是标准的(反斜杠转义逗号),直接指定Csv.Document的转义字符参数,让Power BI自动识别转义的逗号,无需手动替换:
Source = Web.Contents("https://link.csv"), ParsedCSV = Csv.Document(Source, [ Delimiter=",", Columns=38, Encoding=65001, QuoteStyle=QuoteStyle.None, EscapeCharacter="\" // 指定反斜杠为转义字符 ]) in ParsedCSV
这个方法从根源上避免了全量文本处理的内存问题,同时准确识别单元格内的转义逗号。
3. 分批处理或启用增量加载
如果文件依然超出内存承载上限,可以尝试:
- 用
Table.Split将解析后的大表拆分为多个小表,分批处理 - 在数据流设置中启用增量刷新,基于行标识或时间戳配置刷新策略,每次仅加载新增数据
内容的提问来源于stack exchange,提问作者b1032c
相关产品推荐
相关产品推荐

