在 Excel 查询编辑器中合并具有不同列数的 CSV 文件文件夹

Posted

技术标签:

【中文标题】在 Excel 查询编辑器中合并具有不同列数的 CSV 文件文件夹【英文标题】:Combine folder of CSV files with different number of columns in Excel Query Editor 【发布时间】:2018-06-11 18:07:15 【问题描述】:

我有一个包含许多 CSV 文件的文件夹,其中前八列具有相同的标题,但前八列之后的列数量不同。我正在尝试使用 Excel 2016 中的查询和连接来完成此操作。

以下是CSV文件格式的示例(假设A-H中有字符串值):

----------------------------------------------------------------------------------------------------------------
|     A     |  B  |  C  |  D  |  E  |  F  |  G  |  H  | Company 1 | Value (1) | Company 2 | Value (2) | etc... |  
----------------------------------------------------------------------------------------------------------------  
| Product 1 |     |     |     |     |     |     |     |    .05    |   25.00   |    .08    |   14.00   |        |  
----------------------------------------------------------------------------------------------------------------  
| Product 2 |     |     |     |     |     |     |     |    .16    |   43.00   |    .06    |   18.00   |        |  
----------------------------------------------------------------------------------------------------------------  

再次重申:每个 CSV 文件的 A - H 列都相同,但每个文件的公司/值的数量不同(每个文件的公司名称不同)。

我已经为一个 CSV 文件完成了必要的步骤,并希望有某种方法可以将其用作其他文件的模板。

以下是我需要在 Excel 的查询编辑器中执行的步骤:

删除一些“A-H”列(这些标题匹配所有文件,应该不难) 删除所有“值 (#)”列 - 每个 CSV 文件中这些列的数量不同 取消透视所有“公司#”列(现在是匹配列 A - H 之后的每一列,因为在上一步中删除了“值 (#)”列) 将包含所有公司名称的列重命名为“公司” 将每个公司下之前包含所有值的列重命名为“成本”

以下是“高级查询编辑器”中的应用步骤:

#"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers","A", type text, "B", type text, "C", type text, "D", type text, "E", type number, "F", type text, "G", Currency.Type, "H", Currency.Type, "Company 1", type text, "Value (1)", Currency.Type, "Company 2", type text, "Value (2)", Currency.Type, "Company 3", type text, "Value (3)", Currency.Type, "Company 4", type text, "Value (4)", Currency.Type, "Company 5", type text, "Value (5)", Currency.Type, "Company 6, type text, "Value (6)", Currency.Type, "Company 7", type text, "Value (7)", Currency.Type, "Company 8", type text, "Value (8)", Currency.Type, "Company 9", type text, "Value (9)", Currency.Type),
#"Removed Other Columns" = Table.SelectColumns(#"Changed Type","A", "C", "D", "E", "Company 1", "Company 2", "Company 3", "Company 4", "Company 5", "Company 6", "Company 7", "Company 8", "Company 9"),
#"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Removed Other Columns", "A", "C", "D", "E", "Attribute", "Value")

有没有什么方法可以导入 CSV 文件的文件夹并将上述步骤应用于每个文件,以便对所有 CSV 文件进行一次查询? (我希望它在下面看起来如何的简短示例)

----------------------------------------------------
|     A     |  C  |  D  |  E  |  Company  |  Cost  |  
----------------------------------------------------
| Product 1 |     |     |     | Company 1 |  .05   |
----------------------------------------------------
| Product 1 |     |     |     | Company 2 |  .08   |
----------------------------------------------------
| Product 2 |     |     |     | Company 1 |  .16   |
----------------------------------------------------
| Product 2 |     |     |     | Company 2 |  .06   |
----------------------------------------------------

【问题讨论】:

【参考方案1】:

我相信是的。这似乎有效。

首先选择获取数据(或新源)> 文件 > 文件夹,然后浏览到包含 csv 文件的文件夹并选择它并单击确定。然后再次单击确定。

您会看到类似以下内容。

点击编辑按钮。

右键单击内容列并删除其他列。你会看到这样的东西。

通过单击右上角的按钮展开内容列,然后在出现的对话框中单击确定,如下所示。

在屏幕左侧的查询下,您会看到如下内容:

我突出显示的查询是您想要完成工作的地方。请注意,它有一个表格图标并以转换示例文件开头。点击它。

在屏幕右侧的应用步骤下,单击来源

在公式栏中,您应该会看到如下内容:= Csv.Document(#"Sample File Parameter1",[Delimiter=",", Columns=12, Encoding=1252, QuoteStyle=QuoteStyle.None])。删除 Columns=12, 部分(从 C 到包括逗号在内的所有内容——它的数字很可能与 12 不同)。

然后从表格中删除要删除的列。

单击转换 > 将第一个标题行用作标题下拉箭头 > 将标题用作第一行。

点击 Transform > Transpose 翻转表格。

选择 Column1 下拉箭头 > 文本过滤器 > 不以开头 > 并键入 Value 并单击确定。

单击“变换”>“转置”将表格翻转回其原始方向。

单击转换 > 使用第一行作为标题。

选择除公司列之外的所有列,然后单击 Unpivot Columns 下拉箭头 > Unpivot Other Columns。 (不要直接选择和旋转公司列。就像我说的那样,间接地做,应该从各种文件中捕获不同数量的公司列。)

在屏幕右侧的 APPLIED STEPS 下,删除每个 Changed Type 步骤。如果您不这样做,它们可能会导致您的查询阻塞。

现在回到这个查询,它本来是您最初的“主要”查询。当然,你的名字叫别的名字,但你会通过它的位置知道它。点击它。

您可能会看到这样的错误。

在屏幕右侧的 APPLIED STEPS 中删除所有 Changed Type 步骤。

您应该会看到类似这样的内容。

【讨论】:

这非常有效!我发现了一些其他随机必要列的问题,这些问题我没有放在初始帖子中,但我只是将这些问题合并到过滤行的步骤中。您使我免于单独进行 850 多个查询的转换。

以上是关于在 Excel 查询编辑器中合并具有不同列数的 CSV 文件文件夹的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在 Spark 中使用 Dataframes(由 structtype 方法创建)合并具有不同列数的 2 个表?

SQL Server中具有不同列数的多个查询的联合结果

excel表格中如何把相同一个数值后所对应的所有列数的特定值找出来?解决问题采纳+6元红包

自动 CSV 文件生成,在 Oracle 10g 中具有不同列数的两个标题级别的标题

Python Pandas - 连接两个具有不同行数和列数的数据框

合并两个具有相同列名但在熊猫中列数不同的数据框