如何在 Excel 中组合具有不同列名和列顺序的多个 CSV 文件?

Posted

技术标签:

【中文标题】如何在 Excel 中组合具有不同列名和列顺序的多个 CSV 文件?【英文标题】:How can I combine multiple CSV files with different column names and column order in Excel? 【发布时间】:2020-11-24 22:01:58 【问题描述】:

我有 350 多个 CSV 文件需要合并到一个汇总文件中。 Using Power Query for Excel,我可以在几分钟内轻松合并所有文件。但是,经过检查,并非所有文件都遵循相同的列顺序或名称。例如,一些文件经过:

first, last, address, city, state, username

但其他一些文件通过:

address1, address2, city, state, last_name, first_name, age

使用 Power Query、Excel、VBA 或其他工具 - 有没有办法有效地合并具有不同列名和列顺序的多个 CSV 文件?我尝试在线搜索,但没有一个解决方案与我正在寻找的内容相关 (example)。

上面例子的最终结果应该是这样的:

username, last_name, first_name, age, address1, address2, city, state

一张纸中不存在的任何额外列都可以是空白的(或null),并且最终的列顺序无关紧要,因为以后可以重新排列。

【问题讨论】:

文件是否有标题,您可以检查它们以了解它们的顺序? 【参考方案1】:

类似于this related post,Table.Combine 函数应该可以解决问题,假设您有要匹配列的标题。

通过从文件夹加载加载 CSV 文件,将 CSV 转换为表格格式并提升标题,然后与 Table.Combine 结合。

let
    Source = Folder.Files("C:\Path\To\Folder\With\CSVs"),
    #"Added Custom" = Table.AddColumn(Source, "CSV", each Table.PromoteHeaders(Csv.Document([Content]))),
    #"Combine CSVs" = Table.Combine(#"Added Custom"[CSV])
in
    #"Combine CSVs"

【讨论】:

Table.Combine 看起来像我需要的东西。我运行了您提供的查询,当我查看预览时,它看起来像预期的那样工作。但是,当我保存并加载新合并的数据时,到目前为止,它仍在加载和计数 30+ 百万行。我知道我总共只有 100k+ 行。为什么它会产生这么多? 我不知道这是怎么回事,除非它正在拾取该文件夹中您不打算处理的其他文件。如果您在#"Added Custom" 之前将文件列表过滤到少数几个,它会像您预期的那样运行吗? 该文件夹只有我正在合并的 CSV。我只用了 5 个文件就完成了,它按预期出来了。然而,如果我对同一个文件夹中的所有 350 个文件都这样做,它会达到数百万。有限制吗?我在“添加列”>“自定义列”中添加了您的公式。运行后,我展开新的自定义列。然后,我预览了所有列,在预览中两次看起来都像预期的结果 当我回去手动统计一小批文件的记录总数时,应该是6000条。但是当我对同一小批文件运行查询时,它是 60,000。所以我看了看桌子,它被复制了。我删除了骗子,然后它最终与我手动计算的总数相匹配。有什么办法可以防止重复? 我无法重现您所描述的复制行为,所以我不知道发生了什么。

以上是关于如何在 Excel 中组合具有不同列名和列顺序的多个 CSV 文件?的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA SQL UNION SUM 对具有不同列名的表进行 GROUP BY

Python Pandas - 具有不同列的 Concat 数据框忽略列名

Excel 列名和列序号转换

合并在Apache spark中具有不同列名的两个数据集

java - 如何在java中组合(连接)具有相同列名的两个数据框

如何在R中将2个具有不同行和列号的表组合在一起