读取 csv 的前 n 行而不在 Power Query 中解析整个文件

Reading the first n rows of a csv without parsing the whole file in Power Query

我有这些 csv 数据文件,前五行是我的相关数据,下面是一堆格式错误的数据。当我使用过滤器行时,它仍然读取下面的所有数据,这给我带来了问题。这是有问题的,因为我正在读取整个文件夹的价值,其中一些文件在我感兴趣的行下方有不同数量的列。我不需要的前五行下方的那些列或数据,但电源查询抛出当它查找与上一个文件相同数量的列时出错。我希望它只读入文件夹中所有文件之间统一的前 n 行。

有没有办法做到这一点或绕过错误?让我知道是否还有其他我可以提供的内容来帮助更好地理解我的问题。

我已经尝试过筛选行,但仍然会读取整个文档并引发一些错误。

这与我正在寻找的相似,但我不清楚如何编辑它来实现我想要的。

最终我将阅读文件夹中所有文档的前 5 行。这在 Pandas 中要容易得多,但我需要一个同事的 Excel 解决方案。我得到的错误是 "unexpected number of columns." 我已经通过对我不需要的较低额外数据执行具有相同列数的文件子集来确认这一点。我想要一个足够强大的解决方案来处理所有文件。

当您将 CSV 加载到查询编辑器时,它可能会生成如下 M 代码:

let
    Source = Csv.Document(File.Contents("C:\FilePath\FileName.csv"), [Delimiter=",", Columns=3, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    #"Changed Type" = Table.TransformColumnTypes(Source, {{"Column1", type text}, {"Column2", type text}, {"Column3", type text}})
in
    #"Changed Type"

删除最后一步,#Changed Type,并将第一步中的 Columns=3 更改为您实际需要的数字,而不是自动检测到的数字。

如果您从文件夹中加载,则可以按照以下行编写查询:

let
    Source = Folder.Files("C:\FilePath\FolderName"),
    #"Filtered Rows" = Table.SelectRows(Source, each ([Extension] = ".csv")),
    #"Removed Other Columns" = Table.SelectColumns(#"Filtered Rows",{"Content", "Name"}),
    #"Extracted First 5 Lines" = Table.TransformColumns(#"Removed Other Columns", {{"Content", each Table.FirstN(Csv.Document(_),5)}}),
    #"Expanded Content" = Table.ExpandTableColumn(#"Extracted First 5 Lines", "Content", {"Column1", "Column2", "Column3"})
in
    #"Expanded Content"

关键部分是这个转换: each Table.FirstN(Csv.Document(_),5)

当您创建最后一步时,它将扩展到它看到的尽可能多的列。如果你想让它更有活力,那么试试这样的东西而不是 #"Expanded Content" 行:

MaxColumns = List.Max(List.Transform(#"Extracted First 5 Lines"[Content], each Table.ColumnCount(_))),
#"Expanded Content" = Table.ExpandTableColumn(#"Extracted First 5 Lines", "Content", List.Transform({1..MaxColumns}, each "Column" & Number.ToText(_)))

这确保您有足够的列用于 #"Extracted First 5 Lines" 步骤中最宽的 table。