此案例來(lái)源于雷友會(huì)QQ群(198086726)冬耿。源文件偷懶不給出了。
需求
單元格中的值由為長(zhǎng)度不等的數(shù)字組成萌壳,要求求出每個(gè)單元格的所有數(shù)字之和亦镶,如下圖:
比如,第一行的結(jié)果是6+2+2+5+7+5+7+6+7+6+3+4+2+1+2+7=72袱瓮,以此類推缤骨。
分析
解決這個(gè)問(wèn)題的思路是怎么把單元格的內(nèi)容拆分為獨(dú)立的數(shù)字,否則無(wú)法求和尺借。
一旦涉及到拆分绊起,我們首先想到的是分列,這就是群里“新云”給出的方法一【按位置分列版】燎斩。
不過(guò)我這兩天在啃Python虱歪,里邊提到文本操作時(shí),可以用list()函數(shù)把單詞拆分為由字母組成的list栅表,如list(wanght)=['w','a','n','g','h','t']笋鄙。我在群里瞄見(jiàn)這個(gè)例子后,突發(fā)奇想怪瓶,PowerQuery會(huì)不會(huì)有類似功能的函數(shù)呢萧落?打開函數(shù)參考,一個(gè)一個(gè)找洗贰,果然被我找到了Text.ToList()這個(gè)函數(shù)找岖,它起的作用和Python中的list()一模一樣。所以這就是方法二【Text2List版】敛滋。
按位置分列求和
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
復(fù)制的列 = Table.DuplicateColumn(源, "數(shù)字", "numbers"),
用位置分列 = Table.SplitColumn(復(fù)制的列,"numbers",Splitter.SplitTextByRepeatedLengths(1),{"數(shù)字 - 復(fù)制.1", "數(shù)字 - 復(fù)制.2", "數(shù)字 - 復(fù)制.3", "數(shù)字 - 復(fù)制.4", "數(shù)字 - 復(fù)制.5", "數(shù)字 - 復(fù)制.6", "數(shù)字 - 復(fù)制.7", "數(shù)字 - 復(fù)制.8", "數(shù)字 - 復(fù)制.9", "數(shù)字 - 復(fù)制.10", "數(shù)字 - 復(fù)制.11", "數(shù)字 - 復(fù)制.12", "數(shù)字 - 復(fù)制.13", "數(shù)字 - 復(fù)制.14", "數(shù)字 - 復(fù)制.15", "數(shù)字 - 復(fù)制.16", "數(shù)字 - 復(fù)制.17"}),
逆透視的其他列 = Table.UnpivotOtherColumns(用位置分列, {"數(shù)字"}, "屬性", "值"),
更改的類型 = Table.TransformColumnTypes(逆透視的其他列,{{"值", Currency.Type}}),
分組的行 = Table.Group(更改的類型, {"數(shù)字"}, {{"求和", each List.Sum([值]), type number}})
in
分組的行
Text2List之后求和
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
復(fù)制的列 = Table.DuplicateColumn(源, "數(shù)字", "numbers"),
文本到List = Table.AddColumn(復(fù)制的列, "list", each Text.ToList([numbers])),
ListSum求和 = Table.AddColumn(文本到List, "求和", each List.Sum(List.Transform([list],each Number.From(_)))),
刪除的列 = Table.RemoveColumns(ListSum求和,{"numbers", "list"})
in
刪除的列
總結(jié)與反思
觀察兩個(gè)方法许布,發(fā)現(xiàn)都用了List.Sum()這個(gè)函數(shù)。所以矛缨,這個(gè)函數(shù)是處理這類求和問(wèn)題的關(guān)鍵爹脾,就是把求和對(duì)象拆解為list,然后來(lái)求和箕昭。而得到一個(gè)list的方法是多種多樣的灵妨。就我個(gè)人而言,更喜歡我自己找到的Text2List方法落竹,因?yàn)檫@個(gè)只涉及Text.ToList()和List.Sum()這兩個(gè)函數(shù)泌霍,而【按位置分列求和】涉及到復(fù)雜的分列、逆透視和分組操作。
這個(gè)例子還可以有多種變形朱转,比如有些人喜歡把手機(jī)號(hào)碼的各組成數(shù)字求和蟹地,或者把自己名字的拼音字母求和等。