Объединяйте CSV-файлы с различными структурами с течением времени - PullRequest
0 голосов
/ 24 декабря 2018

Я здесь, чтобы задать вам гипотетический вопрос.

Часть моей текущей работы состоит в создании и обновлении панелей мониторинга.Большинство инструментальных панелей нужно обновлять каждый день.

Я создал инструментальную панель PowerBI из данных, связанных с папкой, заполненной CSV-файлами.Я сделал несколько запросов, чтобы редактировать некоторые вещи.Поэтому каждый день я загружаю файл csv из веб-приложения клиента и добавляю указанный файл в связанную папку, все обновляется автоматически и все созданные запросы применяются.

Гипотетический сценарий: мой клиент меняет CSVструктура (например, порядок столбцов, несколько имен столбцов).Как я могу справиться с этим, чтобы я мог обновлять свою таблицу объединенных csv-файлов?

Я полагаю, что файлы с новой структурой помещаются в другую папку, применяются новые запросы, чтобы структуры таблиц соответствовали, а затемдобавить запросы, чтобы у меня была одна таблица данных.

Есть ли лучший способ?

Заранее спасибо.

1 Ответ

0 голосов
/ 26 декабря 2018

Скажем, у меня есть несколько 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, хотя и с некоторыми nulls / blanks -именно поэтому важно, чтобы все переименования были выполнены до этой строки.

  • После объединения вы, очевидно, можете делать с таблицей все, что еще нужно.

Попробуйте проверить, работает ли он в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...