#excel #powerquery #business-intelligence #analysis
#excel #powerquery #бизнес-аналитика #анализ
Вопрос:
Недавно я столкнулся с проблемой, которая, надеюсь, разрешима.
В настоящее время у меня есть power query, указывающий на папку, содержащую несколько файлов CSV. Обычно это не проблема, однако в данном случае не все файлы имеют одинаковые столбцы.
Есть ли способ заставить power query возвращать каждый уникальный столбец, найденный в папке, заполняющий пустые наблюдения данных нулевыми значениями?
Предположим, что в моей папке есть файлы csv, похожие на следующие (обратите внимание, что строки индексируются с использованием букв для удобства ссылки):
Я бы хотел, чтобы моя итоговая таблица выглядела примерно так:
Кажется, что это должно быть довольно просто, но я не могу понять это ни за что на свете! Любая помощь будет принята с благодарностью!
Ответ №1:
Предполагая, что вы используете Folder.Files
, я думаю, вы можете:
- Возьмите
Content
столбец таблицы, возвращенныйFolder.Files
— который должен дать вам список двоичных значений. - Проанализируйте каждый элемент в списке как документ CSV, используя
List.Transform
иCsv.Document
— который должен дать вам список таблиц. - Затем объедините свой список таблиц с
Table.Combine
—, что должно дать вам одну единственную таблицу.Table.Combine
следует позаботиться о деталях (например, выровнять имена столбцов).
Вы не указали никакого кода в своем вопросе, поэтому трудно привести соответствующий пример, но я думаю, что приведенный ниже код дает мне ожидаемый результат.
Я превратил индексы строк в 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 " amp; _ amp; ".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
, как вы, по-видимому, уже используете в своем собственном коде.
Ответ №2:
Я всегда использовал что-то вроде этого
//read all files in specified directory you fill in here
let Source = Folder.Files("C:directorysubdirectory"),
//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]amp;""amp;[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"