Страницы: 1
RSS
Транслировать типы данных из таблицы-образца Power Query M
 
Коллеги, здравствуйте!
Хотел бы создать универсальную таблицу-шаблон-накопитель с заданными типами данных для столбцов, чтобы впоследствии транслировать типы данных по наименованиям столбцов одновременно в несколько последующих запросов
(проработку начал из темы Задать для всех столбцов один тип в Power Query)
Код
= Table.TransformColumnTypes(РазвернутыСтолбцы, List.Transform(РазвернутыСтолбцы, Value.Type(табValueType)))
Код вызвал ошибку преобразования значения типа Table в тип List
Возможно ли вообще подобным образом системно транслировать типы данных?
Изменено: Дмитрий Марков - 17.11.2021 13:11:54
 
Вы файл приложите, как это должно выглядеть?
Вот шаблон с типами
Вот таблица которую нужно типизировать.
Вот горшок пустой, он предмет простой...
 
Да, разместил и сократил - спасибо
 
Цитата
написал:
с заданными типами данных для столбцов, чтобы впоследствии транслировать типы данных по наименованиям столбцов одновременно в несколько последующих запросов
если типы и имена столбцов заранее известны - то можно. Только непонятно как именно Вы хотите видеть решение и какова задача. Т.к. есть какие-то исходные данные и какие-то попытки решения, но никакого намека на тот результат, который ожидаете. Если в грубой форме, то можно запрос табValueType записать так:
Код
let
    Источник = 
      {
        {"ИНН", Int64.Type}, 
        {"ЮЛ", type text}, 
        {"Name", type text}, 
        {"Дата", type datetime}, 
        {"Текст3", Int64.Type}, 
        {"Количество", type number}, 
        {"Сумма", type number}
      }
in
    Источник
а потом в запросе Т записываете все очевидным образом:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Т"]}[Content],
    Value.Type = Table.TransformColumnTypes(Источник, табValueType)
in
    Value.Type
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий, да, большое спасибо, это почти так, только плюсом, для большей гибкости, я хотел бы иметь возможность пропуска столбцов, чтобы работать со всеми таблицами от общего табValueType , если корректно формулирую свой вопрос

Т.е., в идеале, в табValueType создавать и накапливать все типы данных для всех столбцов, и раздавать типы на любые таблицы внутри структуры запросов
Изменено: Дмитрий Марков - 17.11.2021 16:11:44
 
Дмитрий Марков, можно вот так, но у вас в таблице T столбцов не хватает
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Т"]}[Content],
    ListOfTypes = Table.ToRows(
        Table.TransformColumns(
            Table.Schema( табValueType )[[Name],[TypeName]], 
            {{"TypeName", (x)=>Expression.Evaluate(x,#shared), Type.Type}})),
    ChangedType = Table.TransformColumnTypes(Источник,ListOfTypes)
in
    ChangedType
Вот горшок пустой, он предмет простой...
 
PooHkrd, да, серьезный способ, но на нехватающий столбец ошибкой все-таки реагирует
MissingField.Ignore, как я понимаю, здесь неприменимо
Изменено: Дмитрий Марков - 17.11.2021 17:05:45
 
PooHkrd, в Table.Schema сократил табValueType до целевого набора столбцов (в каждом случае будет свой) и добавил игнорирование пропусков столбцов - на основных данных у меня поехало ... тестирую

Код
let    Источник = Excel.CurrentWorkbook(){[Name="Т"]}[Content],
    ListOfTypes = Table.ToRows(
        Table.TransformColumns(
            Table.Schema(Table.SelectColumns(  табValueType , Table.ColumnNames( Источник ), MissingField.Ignore))[[Name],[TypeName]], 
            {{"TypeName", (x)=>Expression.Evaluate(x,#shared), Type.Type}})),
    ChangedType = Table.TransformColumnTypes(Источник,ListOfTypes)
in
    ChangedType

Изменено: Дмитрий Марков - 17.11.2021 17:39:49
 
Дмитрий Марков, отлично, главное что суть уловили. Рад был помочь.
Вот горшок пустой, он предмет простой...
 
PooHkrd, да, большое спасибо - очень помогли - не то слово!   - Но как у Вас это получается, Холмс!

PS: еще, мне кажется, способ Дмитрия тоже можно обернуть в что-то подобное, чтобы столбценезависимым стал ...
 
Доброго времени суток. Подскажите как список списков можно отфильтровать?

Код
let
    Источник = 
      {
        {"ИНН", Int64.Type}, 
        {"ЮЛ", type text}, 
        {"Name", type text}, 
        {"Дата", type datetime}, 
        {"Текст3", Int64.Type}, 
        {"Количество", type number}, 
        {"Сумма", type number}
      }
in
    Источник


к пример по этому списку

{"ИНН","ЮЛ", "Name"}

т.к. я наворотил хрен знает что

Код
список={{"текс", type text}, {"текс2", type text}, {"дата", type date}, {"дата2", type date}, {"число", type number}, {"число2", type number}},
    #"Преобразовано в таблицу" = Table.FromList(список, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Преобразовано в таблицу", "Пользовательский", each Record.FromList([Column1],{"имя","тип"})),
    select=Table.ToRecords( Table.SelectRows( Table.FromRecords(#"Добавлен пользовательский объект"[Пользовательский]),each List.ContainsAny( {[имя]},names))),
    #"Преобразовано в таблицу1" = Table.FromList(select, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Добавлен пользовательский объект1" = Table.AddColumn(#"Преобразовано в таблицу1", "Пользовательский", each Record.ToList([Column1]))[Пользовательский],
    
    names = Table.ColumnNames(Источник),
 
Добрый вечер.
Код
let
    src = 
      {
        {"ИНН", Int64.Type}, 
        {"ЮЛ", type text}, 
        {"Name", type text}, 
        {"Дата", type datetime}, 
        {"Текст3", Int64.Type}, 
        {"Количество", type number}, 
        {"Сумма", type number}
      },
      filter = {"ИНН","ЮЛ", "Name"},
      select = List.Select(src, (x)=>  List.ContainsAny(x,filter))
in
    select
 
Alex, спасибо!
 
Наверное, попроще (в данном случае - пофиг, но для больших списков и пошустрее)
Код
select = List.Select ( src, (x) =>  List.Contains ( filter, x{0} ) )
Изменено: surkenny - 02.11.2023 08:01:37
 
Цитата
написал:
в данном случае - пофиг, но для больших списков и пошустрее
Круть! Регулярно настраиваю в больших системах, как представится — сразу применю — Большое спасибо!
 
Только осторожнее с List.Contains. Если список filter (именно filter, на объем src все равно) большой, то будет довольно медленно работать.
В таком случае лучше на словаре из записей:
Код
let
  src = {
    { "ИНН", Int64.Type },
    { "ЮЛ", type text },
    { "Name", type text },
    { "Дата", type datetime },
    { "Текст3", Int64.Type },
    { "Количество", type number },
    { "Сумма", type number }
  },
  filter = { "ИНН", "ЮЛ", "Name" },
  filterRec = Record.FromList ( List.Repeat ( { true }, List.Count ( filter ) ), filter ),
  select = List.Select ( src, ( x ) => Record.FieldOrDefault ( filterRec, x{0}, false ) )
in
  select
 
surkenny, подскажите, список filter есть смысл запихнуть в буфер? Он будет брать имена с таблицы
 
mechanix 85, тут нет по 2 причинам:
1. в буфер следует брать либо получаемые каким-то кодом из данных списки, либо генерируемые типа {1..100}.
2. для примера вообще все равно :) Это же типизация столбцов. Ну сколько их? 20,50,100? Вообще любой код подойдет, разницу не ощутите :)
 
Доброе время суток.
Коллеги, подскажите, пожалуйста, а в чём принципиальный смысл задавать определение имён столбцов и их типов как список? В чём профит? Чем так хуже?
Код
let
    commonColumnTypeDefinition = [
        #"ИНН" = Int64.Type,
        #"ЮЛ" = type text,
        #"Name" = type text,
        #"Дата" = type datetime,
        #"Текст3" = Int64.Type,
        #"Количество" = type number,
        #"Сумма" = type number 
    ],
    filter = { "ИНН", "ЮЛ", "Name" },
    selectedColumnTypes = List.Transform(filter, each {_, Record.Field(commonColumnTypeDefinition, _)})
in
    selectedColumnTypes
 
Андрей VG, не спорю ни в коем случае :) Я бы еще вместо списка filter взял бы тупо Table.ColumnNames таблицы данных и вместо Record.Field - Record.FieldOrDefault ( commonColumnTypeDefinition, _, type any ).
А так - я отвечал на вопрос о фильтрации списков :)
 
Андрей VG, для меня записи еще дремучий лес)))

surkenny, понял, спасибо!

ЗЫ: данный код применил, все работает ок!
 
Цитата
surkenny написал:
вместо Record.Field - Record.FieldOrDefault ( commonColumnTypeDefinition, _, type any )
Согласен, спасибо :)
 
ИНН, конечно, лучше = Text.Type

Починку потерянных начальных нулей делаю потом на Text.PadStart, если 9 или 11 символов в ИНН
Страницы: 1
Наверх