本期案例前後轉換效果如下:
解題套路
1.Table.FirstN
解題思路:添加新列,對項目類型進行判斷填列。
當為數字的時候,先擷取目前行在源表中的位置n,删除n+1行,這樣就獲得了除目前行以後的行。接着隻要擷取下一個數字之前的行,深化合并,就是所需要的結果。
Table.AddColumn(源,"result",each if [item] is number then Text.Combine(Table.FirstN(Table.Skip(源,Table.PositionOf(源,_)+1),each [item] is text)[item],"-") else "")
2.List.FirstN
解題思路:改思路同上,差別在于,前一個是擷取後再深化,後一個則是先深化再擷取。
Table.AddColumn(源,"result",each if [item] is number then Text.Combine(List.FirstN(Table.Skip(源,Table.PositionOf(源,_)+1)[item],each _ is text),"-") else "")
3.Table.Group
解題思路:使用分組函數的第五參數進行分組,對分組後的子表添加新列,對首行進行指派即可,值為項目列直接深化,去除首項後合并。
Table.Combine(Table.Group(源,"item",{"a",each Table.AddColumn(_,"result",(x)=>if x[item] is number then Text.Combine(List.Skip([item]),"-") else "")},0,(x,y)=>Number.From(y is number))[a])
4.List.Accumulate
解題思路:考慮到需要合并後續的資料,可以先對轉換後的清單進行逆序排列,這樣對于不符合要求的就可以直接進行合并處理,最後對結果再進行逆序排列即可。
Table.FromRows(List.Reverse(List.Accumulate(List.Reverse(Table.ToRows(源)),{{},{}},(x,y)=>if y{0} is number then {x{0}&{y&{Text.Combine(List.Reverse(x{1}),"-")}},{}} else {x{0}&{y&{""}},x{1}&y}){0}),{"item","result"})
以上是本期内容。