给定的一串数字中统计出大于3的数字之间3的个数:
我们用剔除法,先是剔除小于3的数字,只保留3以及大于3的数字,然后找出大于3的数字的位置,通过位置进行统计,我们需要在结尾添加一个位置,来补齐。
我们来看Power Query中的具体操作:
建一个参数,存储这一串数字:
然后建立一个空查询,开始我们的计算过程:
第一步是要把这串数字分成单个的列表:
=Text.ToList(a)
然后我们在这个列表的基础上,剔除小于3的数字,并区分3与大于三的数字:
我们用了一个循环判断语句:
= List.Transform(
Text.ToList(a),each if Number.From(_)<3 then null else if Number.From(_)=3 then 1 else 0)
因为Text.ToList分解出来的是文本,需要用Number.From转换成数字才能比较,然后我们用List.RemoveNulls函数去除null:
就得到了我们想要的初步结果,当然这个结果我们也可以用别的函数做出来:
List.ReplaceMatchingItems+List.RemoveItems
= List.ReplaceMatchingItems(
List.RemoveItems(Text.ToList(a),{"0".."2"}),{{"3",1},{"4",0},{"5",0},{"6",0},{"7",0},{"8",0},{"9",0}})
这两个结果都还不是最终的列表结果,我们还要补上一个0,在列表的结尾处&{0}:
我们把这个结果作为一个操作步骤保留下来,并开始下一步计算:
在高级编辑器中,把第一步的过程设为l,l就是我们第一步生成的一个列表,下面计算用引用这个列表进行计算:
let
l = List.RemoveNulls(List.Transform(Text.ToList(a),each if Number.From(_)<3 then null else if Number.From(_)=3 then 1 else 0))&{0},
lp=List.Transform({1..List.Count(l)},each if l{_-1}=0 then _ else null)
in
lp
第二步是要找出大于3,也就是l列表中的0的位置编号,通常情况下列表的编号是从零开始的,这个习惯和VBA或其他编程语言中一样是数组的默认下标。我们建立一个列表是用l列表的项目个数作为最大值的列表,从1开始,那么要正确引用l列表中的内容就要这样写:l{_-1},那么each后面的if就可以理解为,l列表中项等于0,就给出编号,否则就是null
去除null得到4个数字:
大家可以计算一下,3的个数应该是大的数字减去小的数字再减去1,第一个例外,只减1就可以了。
我们来写第三步:
ls=List.Transform(
{1..List.Count(lp)},each if _=1 then lp{_-1}-1 else lp{_-1}-lp{_-2}-1)
列表中后一个项目减去前一个项目怎么表达:lp{_-1}-lp{_-2}
这时候结果已经有了,最后一步就是把结果合并起来:
同样的道理要用Text.From函数把数字转换成文本,然后才能用Text.Combine合并:
c=Text.Combine(
List.Transform({1..List.Count(ls)},each Text.From(ls{_-1})))
所有这些过程都结束后,我们就来创建一个函数,用作统计3的个数:
通过这个例子,我们能够了解到Power Query中可以像编写程序解决问题的思路来解题,每一步的过程可以作为后续的参数,通过循环与判断,能够解决很多问题。这个例子中的列表项目引用,与我们其他编程语言中的一维数组的功能是一模一样的。
页面更新:2024-05-04
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号