网站首页 > 知识剖析 正文
给定的一串数字中统计出大于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)
- 让小于3的为null
- 等于3的为1
- 大于3的为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中可以像编写程序解决问题的思路来解题,每一步的过程可以作为后续的参数,通过循环与判断,能够解决很多问题。这个例子中的列表项目引用,与我们其他编程语言中的一维数组的功能是一模一样的。
猜你喜欢
- 2025-09-21 5种方法,快速地将多个符合条件的内容归类至一个单元格中
- 2025-09-21 C#开发学习人工智能的第一步_人工智能开发的编程语言
- 2025-09-21 LeadTools中文入门教程(5):读取和编写条形码
- 2025-09-21 深入CompletableFuture源码:一文搞懂异步编程核心原理
- 2025-09-21 Java 8:CompletableFuture终极指南
- 2025-09-21 Java多线程面试必问题:从volatile到线程池,阿里P8整理核心答案
- 2025-09-21 Visual Studio Package 插件开发(Visual Studio SDK)
- 2025-09-21 特斯拉AI芯片深度解读_特斯拉ai芯片深度解读视频
- 2025-09-21 高级程序员必备:分治算法分享_分冶算法
- 2025-09-21 MapReduce过程详解及其性能优化(详细)
- 最近发表
-
- 5种方法,快速地将多个符合条件的内容归类至一个单元格中
- C#开发学习人工智能的第一步_人工智能开发的编程语言
- LeadTools中文入门教程(5):读取和编写条形码
- 深入CompletableFuture源码:一文搞懂异步编程核心原理
- Java 8:CompletableFuture终极指南
- Java多线程面试必问题:从volatile到线程池,阿里P8整理核心答案
- Visual Studio Package 插件开发(Visual Studio SDK)
- 特斯拉AI芯片深度解读_特斯拉ai芯片深度解读视频
- 高级程序员必备:分治算法分享_分冶算法
- MapReduce过程详解及其性能优化(详细)
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)