Excel Power Query 功能可以与带有标题和其他非表格数据的 .csv 文件一起使用吗?

问题描述 投票:0回答:1

我正在尝试处理 200 个 .csv 文件,每个文件的行数都超过 Excel 允许的最大行数。 .csv 文件遵循下表所示的格式 - 在带有标题的表中,有一个名称条目,后跟数据本身。然后是另一个名称,其下方有相应的数据表。每个 .csv 文件中都会出现相同的名称列表,但其下方的数据表的长度可能有所不同。我想将所有 .csv 文件中具有相同名称(例如“chamber”)的所有表组合起来,并对它们执行数据透视表类型的函数,例如对相同坐标求平均值等。是否可以使用数据模型/Power Query 功能来处理这些文件,或者它们是否需要在 vba 中进行一些预处理,以便在使用 Power Query 之前将它们设置为正确的格式?

CSV 格式

我最初创建了一些 vba 代码,使用 msoFileDialog 功能来打开和询问 .csv 文件来完成上述所有处理,但遇到了文件太长的问题。

excel vba powerquery data-modeling
1个回答
0
投票

如果我正确理解了您的 CSV 的格式 - 您可以使用以下 PowerQuery 来清理并展平一个 CSV:

let
    Source = Csv.Document(File.Contents("C:\...\chamber.csv"),[Delimiter=",", Columns=4, Encoding=65001, QuoteStyle=QuoteStyle.None]),
    // Remove empty rows
    #"Filtered Rows" = Table.SelectRows(Source, each [Column1] <> null and [Column1] <> ""),
    #"Added Index" = Table.AddIndexColumn(#"Filtered Rows", "Index", 1, 1, Int64.Type),
    #"Added Name" = Table.AddColumn(#"Added Index", "Name", each if [Column1] = "[Name]" then #"Added Index"{[Index]}[Column1] else null),
    #"Filled Down" = Table.FillDown(#"Added Name",{"Name"}),
    // Remove empty rows on Column 2 or data header
    #"Filtered Rows1" = Table.SelectRows(#"Filled Down", each [Column2] <> null and [Column2] <> "" and [Column2] <> "Y [ m ]"),
    #"Removed Columns" = Table.RemoveColumns(#"Filtered Rows1",{"Index"}),
    #"Replaced Value" = Table.ReplaceValue(#"Removed Columns","null",null,Replacer.ReplaceValue,{"Column4"}),
    #"Renamed Columns" = Table.RenameColumns(#"Replaced Value",{{"Column1", "X [ m ]"}, {"Column2", "Y [ m ]"}, {"Column3", "Z [ m ]"}, {"Column4", "Yplus Based Heat Tran. Coef. [ W m^-2 K^-1]"}}),
    #"Changed Type" = Table.TransformColumnTypes(#"Renamed Columns",{{"X [ m ]", type number}, {"Y [ m ]", type number}, {"Z [ m ]", type number}, {"Yplus Based Heat Tran. Coef. [ W m^-2 K^-1]", type number}, {"Name", type text}})
in
    #"Changed Type"

这将为您提供一个扁平化的表格,其中有一个额外的“名称”列。首先在一个文件上尝试此操作,使其达到您需要的效果。然后看上面@taller的评论来合并多个文件。

© www.soinside.com 2019 - 2024. All rights reserved.