- 难题 -
通过Power Query生成数据表,一共两列,要求及示例如下:
1、NR列:第1行为1,后每行比上行递增1..7的随机整数
2、NUM列:1..1000之间随机整数
3、生成的行数可按需要输入
- 解法 -
核心就一个函数:List.Generate
代码语言:javascript复制let
n = 10,
源 = Table.FromRecords(
List.Generate(
()=>[i=1,NR=1,NUM=Number.RoundDown(Number.RandomBetween(1,1000))],
each [i]<=n,
each [i=[i] 1,
NR=[NR] Number.RoundDown(Number.RandomBetween(1,7)),
NUM=Number.RoundDown(Number.RandomBetween(1,1000))],
each [[NR],[NUM]]
)
)
in
源
- 这个函数很强大 -
- 这个函数很复杂 -
- 这个函数记不住 -
- 但是 -
- 我们可以这样看 -
List.Generate有4个参数,虽然每个参数都是一个函数!但是,这4个函数有很明确的分工:
1、确定起点,即要生成列表的第1个值;
2、设定生成序列的终止条件;
3、下一个值的生成规则/结果;
4、转换成最终输出结果(如果直接用参数3的结果,可以省略)
- 再来2个帮助文档示例 -
- 示例1 -
代码语言:javascript复制List.Generate(
()=>0,
each _<10,
each _ 1
)
简单解析:
1、从0开始
2、只要得到的结果小于10
3、那就加1作为结果并直接输出(省略第4个参数)
输出结果:{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
- 示例2 -
代码语言:javascript复制List.Generate(
()=>[A=1,B=1],
each [A]<5,
each [A=[A] 1,B=[B] 1],
each [A] [B]
)
简单解析:
1、给定记录[A=1,B=1]
2、如果得到的结果中A小于5
3、那就A 1,B 1;重点:可以用[A]或[B]引用上一结果中的值
4、按需要调整输出结果为A B;重点:可以通过[A]或[B]引用到每一个结果的值
输出结果:{ 2, 4, 6, 8 }
- 总结一下 -
List.Generate其实就是一个循环语句,相对复杂的情况下,可以以记录(Record)的方式作为列表的值,因为记录对每个值有明确的字段名称(类似于在循环中定义变量),方便后续的引用和控制。
同时,我突然想,这个其实跟玩游戏的过程很像:
如果你暂时没有能用上这个函数,那也不妨先通过这种方式把这个的几个参数先记住,然后再对上面几个例子动手写几次,很快就会得心应手了。