神棍 List.Accumulate-总结篇

描述程序是枯燥的,所以不可能一次完成,需要反复修改,所以会有一个一个更新的过程,
做好第一参数:
file
结果:这里必须声明取出的ID长度,我用了一个Text.Length(x{1})<6 确定范围,id>=6
file
基本套路是 if ...then 如果条件符合 ,你希望它干什么,if ...else 如果条件不符合,你希望干嘛?if ..then ...else (if ...then ...else )
用小括号表示层次,要不分不清域块,括号代表在执行else 的代码要不要进行特殊处理,
file

= List.Accumulate(源,{{},""},(x,y)=>
                if x{1}="" and y ="S" then {x{0},y} 
              else if  y < ":" and y >"/"  then {x{0},x{1}&y} 
             //  else if Text.Length(x{1})<6 then  {x{0} ,""}
                else {x{0}&{x{1}},""}) {0}

为了便于说明问题我将 代码// else if Text.Length(x{1})<6 then {x{0} ,""}注销,

"SVA S083-GIA AutorSnated Vial insperction Machine Ught S28623 & po"文本变成list
if x{1}="" and y ="S" then {x{0},y} 这个是什么意思呢,就是你要的第一个值是什么?在对第一个参数进行扫描时,当然是按源的元素顺序进行扫描,而且是一一扫描,不会跳跃,扫描很诚实,如果第二参数的第二个元素下x{1}="",而且 y="s" 就将x{1}&"s"
file
第一个值是"S",符合条件,所以连接成功,
else if y < ":" and y >"/" then {x{0},x{1}&y} 接下来我们给定第二个条件,y必须是文本数字,第二扫描的元素是V,显然是不符合条件的,所以执行了else的代码 else {x{0}&{x{1}},""},将不符合条件的S,移动到列表,并且第二参数,第二个元素清空,进行下一次搜索,看下图,第一个s
file
扫描第三个元素,仍然不符合,执行后面的代码else {x{0}&{x{1}},""},将空移动到第一元素,用空替换第二元素,进行下一次扫描,只有不符合上面这个动作就会重复,
当扫描到第五个元素是"s"符合条件,就会执行第一行的代码 if x{1}="" and y ="S" then {x{0},y} ,如果第一个条件满足,y是文本数字,就会执行第二行代码else if y < ":" and y >"/" then {x{0},x{1}&y} 这些都是条件满足时执行的代码,条件会返回一个true或者false,机器执行的只会按条件执行,
当扫描到"-"时,不符合条件,所以执行else {x{0}&{x{1}},""}完成了一次工作,就是完成了if...then...else...全过程,每次else执行都是一个微过程,整个的过程就是有这些微过程组合而成一个大过程,
让我们看看图:就明白了,S083就是最近的一次结果,拼接和移动,
file
file
不断重复拼接和移动的工作结果表如下,有点长,相信看官应该能看明白,
file
file
简单的认识已经完成了

让我们进入高级阶段,
顺口溜是前面高危,请系好安全带
这次让我们取消 注销,
file
这简直不可能吗,已经达到神级了
哈哈,你错了,神是西方的产物,东方只有神仙,道士,佛祖,都是人的化身,由人修炼成仙,成佛的

= List.Accumulate(源,{{},""},(x,y)=>
                if x{1}="" and y ="S" then {x{0},y} 
              else if  y < ":" and y >"/"  then {x{0},x{1}&y} 
              else if Text.Length(x{1})<6 then  {x{0} ,""}
                else {x{0}&{x{1}},""}) {0}

让我们开始分析吧,源列表
"SVA S083-GIA AutorSnated Vial insperction Machine Ught S28623 & po"文本变成list
file
扫描第一个元素是符合的"S",执行第一行代码if x{1}="" and y ="S" then {x{0},y}
接上第一个"S",扫描第二个元素"V",意味第一步 if x{1}="" and y ="S" then {x{0},y} 会跳过,直接判断第二行代码是否符合else if y < ":" and y >"/" then {x{0},x{1}&y} ,显然 "V"不是文本数字,执行第三行代码else if Text.Length(x{1})<6 then {x{0} ,""},由于 x{1}="",所以长度为1,1<6 返回true 符合长度条件,执行 {x{0} ,""},将上一步的结果清空,返回{x{0} ,""},后面的第三个else没有条件执行,移动到列表这个过程没有产生,这相当于一个筛选.在移动到列表前,对if...then 的执行结果进一步筛选了,
当执行到S083,完成了拼接,但是长度不符合,同样是被筛选掉了,移动到列表没有执行,
当扫描到"-"时,不符合条件,执行else 后面的代码,长度等于0,不移动,第三个else没有执行,所以没有移动,
......
......
.......
........
最后执行到S28623,完成拼接,长度等于7,7<6 返回一个false , 不符合长度条件,所以执行后面的代码 else {x{0}&{x{1}},""}移动到列表
.....
......
.....
.....
只有符合条件的,都会移动到列表
file
如果ID长度=7代码会更简单

= List.Accumulate(源,{{},""},(x,y)=>
                if x{1}="" and y ="S" then {x{0},y} 
              else if  y < ":" and y >"/"  then {x{0},x{1}&y} 
             else if Text.Length(x{1})=7 then {x{0}&{x{1}},""}
                else {x{0} ,""})

数据源修改一下
= Text.ToList("SVA S083123-GIA AutS123456orSnated Vial inspS159465erction Machine Ught S28623 & po")
上面代码处理的结果如下:
file
假如我要的第一个ID,其他的不要如何写代码:

= List.Accumulate(源,{{},""},(x,y)=>
                if x{1}="" and y ="S" then {x{0},y} 
              else if  y < ":" and y >"/"  then {x{0},x{1}&y} 
             else if Text.Length(x{1})=7  and List.Count(x{0})<1  then {x{0}&{x{1}},""}
                else {x{0} ,""})

把这个代码加上去: and List.Count(x{0})<1
file
下面是特殊处理的代码'

= List.Accumulate(源&{""},{{},""},(x,y)=>
                if x{1}="" and y ="S" then {x{0},y} 
              else if  y < ":" and y >"/"  then {x{0},x{1}&y} 
               else if x{1} = "" or Text.Length(x{1})<6 then  {x{0} ,""}
                else {x{0}&{x{1}},""}) {0}

源:
file
结果:
file
要是取最后一个怎么搞

= List.Accumulate(源,{{},""},(x,y)=>
                if x{1}="" and y ="S" then {x{0},y} 
              else if  y < ":" and y >"/"  then {x{0},x{1}&y} 
             else if Text.Length(x{1})= 7   then {{}&{x{1}},""}              

                else {x{0},""} )

file
这就完成了整个过程,
如何对你有帮助,请给我打赏或点赞!