Excel 电源查询:包括在文件夹中的文件中找到的所有唯一列
我最近遇到了一个问题,希望这个问题是可以解决的 目前,我的power query指向一个包含多个CSV文件的文件夹。这通常没有问题,但是,在本例中,并非所有文件都具有相同的列 有没有办法让power query返回文件夹中找到的每个唯一列,并用空值填充空数据观测值 假设“我的文件夹”中有类似于以下内容的csv文件(请注意,这些行使用字母编制索引,以便于参考): 我希望我的最后一张桌子看起来像:Excel 电源查询:包括在文件夹中的文件中找到的所有唯一列,excel,powerquery,business-intelligence,analysis,Excel,Powerquery,Business Intelligence,Analysis,我最近遇到了一个问题,希望这个问题是可以解决的 目前,我的power query指向一个包含多个CSV文件的文件夹。这通常没有问题,但是,在本例中,并非所有文件都具有相同的列 有没有办法让power query返回文件夹中找到的每个唯一列,并用空值填充空数据观测值 假设“我的文件夹”中有类似于以下内容的csv文件(请注意,这些行使用字母编制索引,以便于参考): 我希望我的最后一张桌子看起来像: 这看起来应该很简单,但我一辈子都搞不懂!任何帮助都将不胜感激 假设您使用的是文件夹.Files,我
这看起来应该很简单,但我一辈子都搞不懂!任何帮助都将不胜感激 假设您使用的是
文件夹.Files
,我想您可以:
Folder.Files
返回的表的Content
列,该列将为您提供二进制值列表list.Transform
和CSV.document
将列表中的每个项目解析为CSV文档,这将为您提供一个表列表表合并。合并——这将为您提供一个表<代码>表格。合并
应注意细节(如对齐列名)
在您的问题中,您没有提供任何代码,因此很难给出相关示例,但我认为下面的代码给出了您的预期输出 我将行索引转换为
ID
列,只是为了使最终的表更容易验证/遵循
let
firstCsv =
"ID,one,two,three
A,1,4,7
B,2,5,8
C,3,6,9",
secondCsv =
"ID,one,two,three,four
D,1,6,11,16
E,2,7,12,17
F,3,8,13,18
G,4,9,14,19
H,5,10,15,20",
thirdCsv =
"ID,one,two,yes,no,maybe
I,1,1,1,1,1
J,2,2,2,2,2
K,3,3,3,3,3
L,4,4,4,4,4
M,5,5,5,5,5",
// For example's sake, let's suppose that the contrived table below was
// returned by calling Folder.Files
filesInFolder = Table.FromColumns({
List.Transform({firstCsv, secondCsv, thirdCsv}, Text.ToBinary),
List.Transform({"1".."3"}, each "CSV file " & _ & ".csv"),
List.Repeat({"someFolderPath"}, 3)
}, type table [Content = binary, Name = text, Folder = text]),
parsed = List.Transform(filesInFolder[Content], each
let
csv = Csv.Document(_, [Delimiter = ",", QuoteStyle = QuoteStyle.Csv]),
promoted = Table.PromoteHeaders(csv, [PromoteAllScalars = true])
in promoted
),
// The step below should match the expected output in your question.
combined = Table.Combine(parsed)
in
combined
显然,您需要根据自己的文件夹路径进行调整,并实际调用
folder.Files
,因为您可能已经在自己的代码中了。我一直使用类似的方法
//read all files in specified directory you fill in here
let Source = Folder.Files("C:\directory\subdirectory"),
//filter only csv files
#"Filtered Rows" = Table.SelectRows(Source, each ([Extension] = ".csv")),
//Pull contents of each file into table with an index
#"Added Custom1" = Table.AddColumn(#"Filtered Rows", "Custom", each Table.AddIndexColumn(Csv.Document(File.Contents([Folder Path]&"\"&[Name]),[Delimiter=",", Encoding=1252, QuoteStyle=QuoteStyle.None]),"Index")),
#"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom1", "Custom", {"Column1", "Index"}, {"Column1", "Index"}),
#"Removed Other Columns" = Table.SelectColumns(#"Expanded Custom",{"Column1", "Index", "Name"}),
#"Pivoted Column" = Table.Pivot(#"Removed Other Columns", List.Distinct(#"Removed Other Columns"[Name]), "Name", "Column1"),
#"Removed Columns" = Table.RemoveColumns(#"Pivoted Column",{"Index"})
in #"Removed Columns"