Для последующей обработки необходимо загрузить несколько папок с файлами .csv. В примере показаны 2 папки по 2 файла в каждой. На самом деле папок несколько, содержимое каждой будет добавляться периодически. Размеры файлов могут быть несколько сотен тысяч строк. В каждой папке находятся файлы из одного источника и одного формата. Данные будут использованы в сводных таблицах.
Power Query начал изучать и использовать совсем недавно. Конечно в восторге от возможностей. Но столкнулся вот с чем. При загрузке каждой папки создаются служебные запросы (смотреть в примере). Чем больше папок, тем больше папок с такими запросами. Приходится все время их сворачивать. Может есть способ загружать без них? Плюс при таком способе, приходится возвращаться и переделывать запрос. Так мне нужны дополнительные столбцы (Date modified и Source Name) Попробовал создавать на втором шаге столбец с формулой - Csv.Document([Content], [Delimiter=";", Columns=1о, Encoding=65001, QuoteStyle=QuoteStyle.Csv]) . Но при таком методе необходимо знать кол-во Columns - ?
Может кто подскажет более подходящий вариант в моем случае. На форуме и в инете смотрел, может проглядел. Архив с примером положил на Яндекс.Диск, так он больше 100кб.
этот параметр опциональный. если его убрать, то данные будут загружаться по количеству столбцов, определенных по первой строке файла.
Цитата
Shima написал: Попробовал создавать на втором шаге столбец с формулой
это правильный подход. Можно одновременно повысить заголовки. Затем оставляете Date modified и Source Name + новый столбец, и разворачиваете таблицу нового столбца. Однако там тоже есть подвох - список имен столбцов автоматически хардкодится для каждого случая. Чтобы избежать этого, добываем список столбцов сами:
Код
let
Источник = Folder.Files(Excel.CurrentWorkbook(){[Name="Parameters"]}[Content]{1}[Значение] & "Папка1"),
#"Removed Other Columns" = Table.SelectColumns(Источник,{"Name", "Date modified", "Content"}),
#"Added Custom" = Table.AddColumn(#"Removed Other Columns", "Data", each Table.PromoteHeaders(Csv.Document([Content],[Delimiter=";", Encoding=1251, QuoteStyle=QuoteStyle.None]))),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Content"}),
#"Expanded {0}" = Table.ExpandTableColumn(#"Removed Columns", "Data", Table.ColumnNames(#"Removed Columns"[Data]{0}), Table.ColumnNames(#"Removed Columns"[Data]{0}))
in
#"Expanded {0}"
Максим Зеленский, огромное спасибо за быстрый ответ. Буду разбираться. Вариант хардкорнее я нашел . Но я не программист нисколько и не смог разобраться, как вы это делаете? Попробовал в конце кода потренироваться, но пока для меня это сложно. Не могу понять как подставлять формулы. Не по памяти же их все вводить.
Код
let
path = Excel.CurrentWorkbook(){[Name="Данные"]}[Content]{0}[Column1],
files = Folder.Files(path),
csvFiles = Table.SelectRows(files, each Text.Lower([Extension])=".csv")[[Name],[Content]],
toDate = (this as text) =>
let
text = Text.Range(this, 0, 10),
parts = Text.Split(text, "_"),
return = #date(Number.From(parts{0}),Number.From(parts{1}),Number.From(parts{2}))
in
return,
csvData = Table.TransformColumns(csvFiles, {
{"Name", each toDate(_)},
{"Content", each Table.PromoteHeaders(Csv.Document(_,[Delimiter=";",Encoding=1251])),type table}
}),
toTable = Table.ExpandTableColumn(csvData, "Content", {"t обратки", "t подачи", "t1", "t2", "Время"}),
return = Table.TransformColumnTypes(toTable,{{"Name", type date}, {"t обратки", type number}, {"t подачи", type number}, {"t1", type number}, {"t2", type number}, {"Время", type time}}),
пример = Table.AddColumn(return, "Пример", each [t обратки]*[t подачи]),
#"Измененный тип" = Table.TransformColumnTypes(пример,{{"Пример", Int64.Type}})
in
#"Измененный тип"
Еще раз спасибо, а то я уже кучу времени убил. Находил много вариантов, но как то все не то.
Ну, в основном, используя логику языка Power Query и преобразований. Главное, знать, что любой шаг может ссылаться также и на любой другой, кроме предыдущего (ну и явных циклов), а также функциональную природу языка (почти как формулы в Excel).
на примере менее хардкорного метода: Строка 3: если вы в нужном порядке кликаете по столбцам с зажатым Ctrl, а затем выбираете команду "Удалить другие столбцы", вы де-факто запускаете команду "Выбрать столбцы", причем порядок будет запомнен. Такая особенность. Таким образом экономите шаг на перестановку столбцов. Можно, конечно, и вручную, если не лень
Строка 4: Table.AddColumns - итератор, то есть запускает какую-то функцию для каждой строки. Если берем ваш вариант, то функция - Csv.Document. В моем варианте эта функция запихнута в другую - Table.PromoteHeaders. Особенность языка такая, что мы можем результат одной функции сразу использовать как вход для другой. Если бы я работал только с одним документом, я бы сначала получил таблицу, вторым ходом я бы повысил заголовки. Здесь реализовано то же самое, только в один шаг.
Строка 6: чтобы сделать универсальное решение, нужно чтобы не учитывалась разница в заголовках столбцов вложенных таблиц, мол, развернул и все. К сожалению, PQ так не делает. Поэтому представьте, что предыдущим шагом я получил список имен столбцов из первой ячейки столбца Data, содержащей таблицу (почти как в хардкорном варианте). Скопировал код этого шага и удалил его. Затем вставил этот код (т.е. получил этот список и передал) сначала как 3-й аргумент в разворачивающую функцию - какие столбцы берем из вложенной таблицы, затем как 4-й аргумент - имена новых соответствующих столбцов развернутой таблицы (при желании их, кстати, можно задать сразу другими - но это уже так, к слову).
В хардкорном варианте я вместо добавления столбца и последующего удаления исходного сразу применяю функцию преобразования (в данном случае это удобнее). Затем получаю отдельной переменной список имен столбцов и ссылаюсь на него в последнем шаге.
Можно делать вариант для одного документа, потом в редакторе править код (почти как правка кода макрорекордера в VBA) и подставить его в нужное место. Можно использовать то, что предлагает PQ автоматически (фактически вот эти "служебные запросы" - это болванка для функций, которые применяются для преобразования ваших таблиц, то, что вы там примените, превратится в измененную функцию). Но это немного неочевидно для новичков. А можно и да, писать руками. Основных наиболее часто используемых функций не так много, а другие можно подсмотреть в библиотеке.
Максим Зеленский, фух, все заработало. Сделал все по вашему коду, но добавил еще на втором шаге "SelectRows = Table.SelectRows(Source, each ([Extension] = ".csv"))," на всякий случай. Иногда в папки попадают и .txt. Еще такая странность. Одни файлы он нормально импортирует по "Encoding=1251, QuoteStyle=QuoteStyle.None", а на другие не в какую не хочет. Сбивается на каких нибудь строках и перемешивает столбцы. Кол-во строк удваивается. Причем бывает сразу и не заметишь этого. В первых строках, что видно, все хорошо. Вот тут табличка с подсчетам строк помогает. В общем я заменил все на "Encoding=1251, QuoteStyle=QuoteStyle.Csv". Пока вроде без сбоев грузит. Но в каком-то файле был и Encoding=65001. Хотя все файлы выгружаются из одной программы. Еще такой вопрос про удаление дублей. Как можно сделать, чтобы удалялись старые а новые сохранялись? Ориентироваться можно по Date modified
Итого. Пока общий объем загруженных папок примерно 1Гб, Excel-файл с запросами - 233мб. Это я еще Сводные таблицы не строил. Но пока он себя довольно бодро чувствует. Есть какие-то ограничения, что-то даже не по себе от такого. Раньше уже на 30мб не работал
Мне особой нужды нет их выгружать на лист. Только подключение, некоторые в модель данных. Да у меня и не влезет на лист, есть файлы больше 1млн строк и по 70 столбцов. Мне их нужно отфильтровать, а что останется уже в модели планирую анализировать и делать сводные.
Цитата
Максим Зеленский написал: там же можете сделать фильтр по Date Modified, брать только последние.
Я неправильно вопрос задал. Дубли нужно удалить те, которые есть в новом и старом файле. Из них оставить те, что есть в новом(идентификатор ID, другие столбцы могут поменяться). Но бывает и так, что уники есть только в старых, а в новых их нет. Тогда удалять не нужно.
Добавлю еще что заметил при выгрузке .csv. У меня в некоторых столбцах текст. Так вот когда в нем, есть непонятные символы, какие то значки, даже программный код встретился, то столбцы сбиваются. Я разбираться с этим не стал, просто удалил. Такого немного было.
Вообще Power Query штука прикольная. Просто не ожидал, как все здорово. В моем случае вообще великолепно, когда надо много ненужного профильтровать. Вот сделал пример для импорта, с вашей и Андрея VG помощью. Может новичкам, типа меня пригодится.