Power Query: включить все уникальные столбцы, найденные в файлах из папки

#excel #powerquery #business-intelligence #analysis

#excel #powerquery #бизнес-аналитика #анализ

Вопрос:

Недавно я столкнулся с проблемой, которая, надеюсь, разрешима.

В настоящее время у меня есть power query, указывающий на папку, содержащую несколько файлов CSV. Обычно это не проблема, однако в данном случае не все файлы имеют одинаковые столбцы.

Есть ли способ заставить power query возвращать каждый уникальный столбец, найденный в папке, заполняющий пустые наблюдения данных нулевыми значениями?

Предположим, что в моей папке есть файлы csv, похожие на следующие (обратите внимание, что строки индексируются с использованием букв для удобства ссылки):

введите описание изображения здесь

Я бы хотел, чтобы моя итоговая таблица выглядела примерно так:

введите описание изображения здесь

Кажется, что это должно быть довольно просто, но я не могу понять это ни за что на свете! Любая помощь будет принята с благодарностью!

Ответ №1:

Предполагая, что вы используете Folder.Files , я думаю, вы можете:

  1. Возьмите Content столбец таблицы, возвращенный Folder.Files — который должен дать вам список двоичных значений.
  2. Проанализируйте каждый элемент в списке как документ CSV, используя List.Transform и Csv.Document — который должен дать вам список таблиц.
  3. Затем объедините свой список таблиц с 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"