我在这里问你一个假想的问题。
我当前工作的一部分包括创建和更新仪表板。大多数仪表板都必须每天进行更新。
我已经从链接到包含csv文件的文件夹的数据创建了PowerBI仪表板。我做了一些查询来编辑一些东西。因此,每天,我都会从客户端的Web应用程序下载一个csv文件,并将该文件添加到链接的文件夹中,所有内容都会自动更新,并且所有创建的查询都将被应用。
假设的情况:我的客户更改了csv结构(例如列顺序,一些列名称)。我该如何处理,以便可以使合并的csv文件表保持更新状态?
我的猜测是将具有新结构的文件放在另一个文件夹中,应用新查询以使表结构匹配,然后追加查询,以使我只有一个数据表。
有更好的方法吗?
谢谢。
答案 0 :(得分:0)
说我有一些CSV(都在同一文件夹中),我需要将它们附加/合并到一个Excel表中,但是:
第一个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 }} /空白-这就是为什么在该行之前完成所有重命名的重要性。
一旦合并,您显然可以对表进行其他操作。
尝试一下,看看它是否适合您的情况。