Table.ColumnsOfType()可以抽象地概括为function(table as table, listOfTypes as list) as list, 大致上可以理解为该函数的第一个参数为表格,第二个参数是元素为数据类型常数的基本串列,第一个参数所有的数据类型为第二参数指定的类型之一的列会作为输出结果的元素。注意,如果函数无法返回预期的结果,需要为类型常数加上修饰词nullable。以下将通过一个99列一行的表格(DB)说明该函数的用途:
该表格的每一个列的名称为“Col" & 列的次序数,开头三十三列为数字,中间33列为文本,剩余的列为日期。在进行某些操作后,列的数据类型退化为Any.Type,出现这种情况时可以使用以下代码进行还原:
let SerialTransform= Table.FromRecords( Table.TransformRows( DB, (x)⇒ Record.AddField( Record.TransformFields( x, { "Col1", each x[Col1] * x[Col2] } ), "NewCol", false ) ) ), DataType= Table.TransformColumnTypes( SerialTransform, List.Combine( { List.TransformMany( { type nullable text, type nullable date, type nullable number }, each Table.ColumnsOfType( DB, { _ } ), ( x, y ) ⇒ { y, x } ), { { "NewCol", Logical.Type } } } ) ) in DataType
SerialTransform步骤转化DB的Col1为Col1乘以Col2的结果并添加了值为false的“NewCol”列,完成后所有列的数据类型为Any.Type。之后利用List.TransformMany()使Table.ColumnsOfType()的结果转化为Table.TransformDataTypes()第二个参数需要的结构就完成了数据类型的还原。
"each [Col1] * [Col2]" 应为 "each x[Col1] * x[Col2]"
已经订正,谢谢
有什么好的办法可以自动的识别列的数据类型,因为“自动更改类型”步骤在后续的增加列操作时会发生错误,是否有个函数能够自动识别列数据类型?
虽然没能看懂你的问题,不过可以试试Table.Schema()。