随着时间的推移结合具有不同结构的CSV文件

时间:2018-12-24 16:41:02

标签: powerquery

我在这里问你一个假想的问题。

我当前工作的一部分包括创建和更新仪表板。大多数仪表板都必须每天进行更新。

我已经从链接到包含csv文件的文件夹的数据创建了PowerBI仪表板。我做了一些查询来编辑一些东西。因此,每天,我都会从客户端的Web应用程序下载一个csv文件,并将该文件添加到链接的文件夹中,所有内容都会自动更新,并且所有创建的查询都将被应用。

假设的情况:我的客户更改了csv结构(例如列顺序,一些列名称)。我该如何处理,以便可以使合并的csv文件表保持更新状态?

我的猜测是将具有新结构的文件放在另一个文件夹中,应用新查询以使表结构匹配,然后追加查询,以使我只有一个数据表。

有更好的方法吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

说我有一些CSV(都在同一文件夹中),我需要将它们附加/合并到一个Excel表中,但是:

  1. 列顺序在某些CSV中会有所不同,
  2. 并且某些CSV中的标头是不同的(出于某种原因),需要更改/重新命名。

第一个CSV:

a,c,e,d,b
1,1,1,1,1
2,2,2,2,2
3,3,3,3,3

第二个CSV:

ALPHA,b,c,d,e
4,4,4,4,4
5,5,5,5,5
6,6,6,6,6

第三种CSV:

a,b,charlie,d,e
7,7,7,7,7
8,8,8,8,8
9,9,9,9,9
10,10,10,10,10

如果父文件夹(包含我的CSV)位于"C:\Users\user\Desktop\changing csvs\csvs",那么此M代码将帮助我实现所需的条件:

let
    renameMap = [ALPHA = "a", charlie = "c"],
    filesInFolder = Folder.Files("C:\Users\user\Desktop\changing csvs\csvs"),
    binaryToCSV = Table.AddColumn(filesInFolder, "CSVs", each
        let
            csv = Csv.Document([Content], [Delimiter = ",", Encoding = 65001, QuoteStyle = QuoteStyle.Csv]),
            promoteHeaders = Table.PromoteHeaders(csv, [PromoteAllScalars = true]),
            headers = Table.ColumnNames(promoteHeaders),
            newHeaders = List.Transform(headers, each Record.FieldOrDefault(renameMap, _, _)),
            renameHeaders = Table.RenameColumns(promoteHeaders, List.Zip({headers, newHeaders}))

        in
            renameHeaders
    ),
    append = Table.Combine(binaryToCSV[CSVs])
in
    append
  • 您需要将代码中的文件夹路径更改为系统上的任何路径。

  • 对于此行renameMap = [ALPHA = "a", charlie = "c"],,我需要将"ALPHA"更改为"a",将"charlie"更改为"c",但是您需要需要替换为需要重命名的列。 (不过,您需要添加许多标题,但需要重命名。)

  • 这一行append = Table.Combine(binaryToCSV[CSVs])将把这些表彼此追加(给您一个表)。它应该自动处理列顺序的差异。如果有任何恶意列(例如,我没有注意到的一个CSV中有一个列f,我的最终表将包含一个列f,尽管其中包含一些{{1 }} /空白-这就是为什么在该行之前完成所有重命名的重要性。

  • 一旦合并,您显然可以对表进行其他操作。

尝试一下,看看它是否适合您的情况。