Страницы: 1
RSS
PQ Быстрый способ получить имена столбцов всех таблиц
 
Здравствуйте. При разворачивании таблиц перечисляются имена имеющихся столбцов. Только если добавятся другие столбцы с именами, не перечисленными в шаге разворачивания, то эти не заявленные столбцы проигнорируются. Есть ли быстрый способ получения списка имен столбцов?
приложил два файла, только испытывать буду на большом количестве
Код
let
    folderPath = "E:\abc\PQ",
    toTable = (fileContent) =>
    let
        fileTable = Csv.Document(fileContent, [Delimiter=",", Encoding=65001, QuoteStyle=QuoteStyle.None]),
        firstRowToHead = Table.PromoteHeaders(fileTable, [PromoteAllScalars=true])
    in
        firstRowToHead,
    Source = Folder.Files(folderPath),
    csvOnly = Table.SelectRows(Source, each Text.Upper([Extension]) = ".CSV")[[Name],[Content]],
    getTables = Table.TransformColumns(csvOnly, {"Content", each toTable(_), Table.Type}),
    Expanded = Table.ExpandTableColumn(getTables, "Content", {" ", "Label", "Area", "Feret", "FeretX", "FeretY", "FeretAngle", "MinFeret"})
in
    Expanded
пробовал другие варианты: при Record.FieldNames расчет очень долгий
Код
    getTables = Table.TransformColumns(csvOnly, {"Content", each toTable(_), Table.Type}),
    Custom = List.Distinct(List.Combine(Table.AddColumn(getTables, "names", each Record.FieldNames([Content]{0}))[names])),
    Custom1 = Table.ExpandTableColumn(getTables, "Content", Custom)
in
    Custom1

вариант с Table.Combine очень хорош, но не прикручивается столбец с именами файлов. По моему, с Table.Combine скорость быстрая, но как прикрутить имена файлов?
Код
    getTables = Table.TransformColumns(csvOnly, {"Content", each toTable(_), Table.Type}),
    commonTable = Table.Combine(getTables[Content])
in
    commonTable
 
Используйте функцию Table.ColumnNames
 
Можно так, например:
Код
let
    folderPath = "E:\2\",
    toTable = (fileContent) =>
    let
        fileTable = Csv.Document(fileContent, [Delimiter=",", Encoding=65001, QuoteStyle=QuoteStyle.None]),
        firstRowToHead = Table.PromoteHeaders(fileTable, [PromoteAllScalars=true])
    in
        firstRowToHead,
    Source = Folder.Files(folderPath),
    csvOnly = Table.SelectRows(Source, each Text.Upper([Extension]) = ".CSV")[[Name],[Content]],
    getTables = Table.AddColumn(csvOnly, "tables", each let n = [Name], t = [Content] in Table.AddColumn( toTable(t), "Name", each n, type text ), type table ),
    combine = Table.Combine( getTables[tables] )
in
    combine

StepanWolkoff, не надо эту штуку использовать, тогда будет происходить двукратное чтение всех csv.
Table.Combine тут рулит и педалит, главное для начала напихать в таблички имена файлов.
Изменено: PooHkrd - 10.01.2020 18:32:50
Вот горшок пустой, он предмет простой...
 
А Вам не это случаем, нужно? - Собрать данные с таблиц с изменяющимися столбцами в PowerQuery
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Доброе время суток
Цитата
abc1 написал:
но не прикручивается столбец с именами файлов.
А вам кто-то запрещает перед этим добавить столбец имени файла к каждой таблице перед объединением? Или вы Ctrl+C, Ctrl+V разработчик на Power Query?
 
Дмитрий(The_Prist) Щербаков, спасибо, но медленно работает
Цитата
Андрей VG написал:
перед этим добавить столбец имени файла к каждой таблице перед объединением
пробовал, но Power Query своими ошибками мне это делать запретил :)  Хотел бы увидеть
PooHkrd, спасибо. Ваш вариант быстрый. То что и хотел. Добавил еще шаг. Не могли бы показать как добавить не один столбец, а два. Например, Name и Folder Path
Код
    combine = Table.Combine( getTables[tables] ),
    Reordered = Table.ReorderColumns(combine ,List.Distinct({"Name"} & Table.ColumnNames(combine)))
in
    Reordered
 
abc1, а в чем сложность? Можно также сохранить значение пути в треть переменную и завернуть все это дело в ещё один Table.AddColumn.
Можно в переменную n сохранить не [Name], а написать типа такого:
Код
n = [Name = [Name], Folder path = [#"Folder path"]]

Тогда добавился столбец с записью из двух полей, которые после объединения можно будет развернуть в 2 столбца.
Но лично я бы запихивал в таблицы столбцы с именами файлов и папок в вашей функции, только как аргумент ей передавать не готовый бинарник, а именно путь и имя файла, а внутри уже обращаться к этому пути через File.Contents. А то ишь, накинулись на готовые бинарники, а потом обижаются что pq не даёт им столбцы с именами в таблицы добавлять.
Вот горшок пустой, он предмет простой...
 
PooHkrd, спасибо большое!
Цитата
PooHkrd написал:
добавился столбец с записью из двух полей, которые после объединения можно будет развернуть в 2 столбца
Смог я это осилить, только для разворота не нашел замену функции Table.ExpandRecordColumn
Цитата
PooHkrd написал:
Можно также сохранить значение пути в треть переменную и завернуть все это дело в ещё один Table.AddColumn
А вот с этим я не справился
 
Цитата
abc1 написал:
А вот с этим я не справился
Там же вроде все просто
Код
path = "E:\2\",//для примера, можно брать и из таблицы
path_col = Table.AddColumn(Source, "Path", each path)
если путь это не некое значение из таблицы, а величина постоянная то еще проще можно:
Код
path_col = Table.AddColumn(Source, "Path", each "E:\2\")
или уж показывайте с чем конкретно не справились и что не так. А то тут уже много всего написано и мне лично не очень понятно какой путь куда надо записать...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
показывайте с чем конкретно не справились и что не так
В последнем шаге вместе с обработкой функцией добавляется столбец со значением столбца Name.
Мне бы хотелось добавить  значения двух столбцов - Name и Folder Path.
Код
let
    folderPath = "E:\abc\PQ",
    toTable = (fileContent) =>
    let
        fileTable = Csv.Document(fileContent, [Delimiter=",", Encoding=65001, QuoteStyle=QuoteStyle.None]),
        firstRowToHead = Table.PromoteHeaders(fileTable, [PromoteAllScalars=true])
    in
        firstRowToHead,
    Source = Folder.Files(folderPath),
    csvOnly = Table.SelectRows(Source, each Text.Upper([Extension]) = ".CSV")[[Name],[#"Folder Path"],[Content]],
    getTables = Table.AddColumn(csvOnly, "tables", each let n =  [Name], t = [Content] in Table.AddColumn( toTable(t), "Name", each n, type text ), type table )
in
    getTables
Один из предложенных вариантов смог реализовать. Вот таким шагом:
Код
Table.AddColumn(csvOnly, "tables", each let n = [Name = [Name], Folder path = [#"Folder Path"]], t = [Content] in Table.AddColumn( toTable(t), "Name", each n, type text ), type table )
А следующее предложение я не смог использовать. Вот это предложение:
Цитата
PooHkrd написал:
Можно также сохранить значение пути в треть переменную и завернуть все это дело в ещё один Table.AddColumn
Хотел бы узнать как сделать третью переменную и завернуть в еще один Table.AddColumn
 
Цитата
abc1 написал:
как сделать третью переменную и завернуть в еще один Table.AddColum
А зачем делать переменную, можно же сразу завернуть результат в новый Table.AddColumn? Чем функция Power Query отличается от формулы - тоже самое функционально программирование.
Ваирант
Код
let
    folderPath = "C:\Path\Csvs",
    toTable = (fileContent) =>
    let
        fileTable = Csv.Document(fileContent, [Delimiter=",", Encoding=65001, QuoteStyle=QuoteStyle.None]),
        firstRowToHead = Table.PromoteHeaders(fileTable, [PromoteAllScalars=true])
    in
        firstRowToHead,
    Source = Folder.Files(folderPath)[[Folder Path], [Name], [Content]],
    contentToTable = Table.TransformColumns(Source, {"Content", toTable}),
    colNames = List.Distinct(List.Combine(List.Transform(contentToTable[Content], each Table.ColumnNames(_)))),
    result = Table.ExpandTableColumn(contentToTable, "Content", colNames, List.Transform(colNames, each _ & ".csv"))
in
    result
Страницы: 1
Наверх