Создайте условную таблицу.TransformColumnType в powerquery

#powerquery #m

Вопрос:

Я пытаюсь преобразовать столбцы в числовые. Если TransformColumnTypes вызывает ошибку, я хочу сохранить ее текстовой. Что-то вроде этого:

 #"Changed Type" = try  Table.TransformColumnTypes(CombineTables,List.Transform(sTranCol, each {_, type number})), otherwise  Table.TransformColumnTypes(CombineTables,List.Transform(sTranCol, each {_, type number})),
 

Очевидно, что это не сработает. sTranCol-это список столбцов, которые нужно преобразовать в числовые. Он создается динамически и не является статичным. Мне все равно, если это приведет к ошибке в ячейке, но транспонирование с ошибками в ячейках приведет к прерыванию запроса.

Ответ №1:

Методы кода M, которые я видел для определения типа данных столбца, состоят из выборки данных и определения типа. Это кажется грязным.

Но, возможно, альтернативой может быть ввод столбцов как числовых, а затем замена значений ошибок чем-то, что не вызовет проблем при транспонировании.

Вот пример кода для замены ошибок на null, но вы можете заменить его чем угодно нулевым или числовым:

 let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSlTSUTJUitWJBpI6SsZglhGQZQ5mVQBZiWCWKZCVBGaZA1kVEB0ghYYmSrGxAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Column1 = _t, Column2 = _t]),
     #"Changed Type" = Table.TransformColumnTypes(Source, 
        List.Transform(Table.ColumnNames(Source), each {_,type nullable number})),
    
    nullList = List.Transform(Table.ColumnNames(#"Changed Type"), each {_, null}),
    #"Replaced Errors" = Table.ReplaceErrorValues(#"Changed Type", nullList)
in
    #"Replaced Errors"
 

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

Измененный Тип
введите описание изображения здесь

Замененные Ошибки
введите описание изображения здесь

Изменить: Добавьте код M для установки типов столбцов в зависимости от того, все ли числовые

 let
    Source = Excel.CurrentWorkbook(){[Name="Table37"]}[Content],

//check data type
//if all numbers set to number, else any

colTypes = List.Accumulate(Table.ColumnNames(Source),
    {},
    (state,current)=> List.Combine({state,
    if List.IsEmpty(
            List.RemoveMatchingItems(
                List.Transform(Table.Column(Source,current), each Value.Type(_)), 
                {type number})) 
    then {{current, type number}} 
    else {{current, type any}}})),

    #"Changed Type" = Table.TransformColumnTypes(Source,colTypes)

in
    #"Changed Type"
 

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

Измененный Тип
введите описание изображения здесь

Комментарии:

1. Спасибо. FWIW, если в последней строке все ошибки, некоторые функции не работают: замена ошибок, транспонирование, удаление строк ошибок. Предполагаю, что он не может найти конец набора, но это просто предположение.

2. @SJE выборочные данные и ожидаемые результаты будут полезны при разработке решения

3. @SJE Я добавил некоторый код для фактического задания типов данных, в зависимости от того, являются ли все данные числовыми, но я подозреваю, что простая замена ошибок может быть более эффективной.