#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 Я добавил некоторый код для фактического задания типов данных, в зависимости от того, являются ли все данные числовыми, но я подозреваю, что простая замена ошибок может быть более эффективной.