split 能否实现从后往前拆
SPL 中的 split 拆分函数其中有一个功能选项是 @1,“找到第一个分隔符即停止,拆成两段”。比如以下例子中,按第一个逗号拆分后就停止拆分:
如果,想实现按从后往前数的第一个逗号拆分,把上图示例中的 "a,b,c" 拆分成 [“a,b”,“c”] 该如何写?有一种方法是用正则,比如:
这里用正则没有问题,但把场景搞复杂一点,文本串中有括号和引号,在拆分时要实现从后往前,并且括号和引号里的分隔符不拆,正则就有点不好写了。比如把 "a,b,[c,[d,e]]" 按最后一个逗号拆分成两段,得到 a,b 和 [c,[d,e]],就会比较费劲了。
注意到了 split 函数中既有 @1 选项也有 @b 选项,我在想官方是否能拓展一下 split 的选项,实现从后往前拆。比如在 MS 的 Power Query 中也有 Splitter 类的函数,里边就指定了参数是从左往右还是从右往左,举例如下:
SPL 中有一些函数有 @z 选项,能实现从后往前的查找,比如 select,pselect,pos…,所以,希望 split 函数也能实现从后往前的拆分。
以上需求,恳请斟酌!
还有另外一些拆分,供参考,比如:
1、按固定长度拆分,SPL 得用正则来实现按固定长度拆分:
2、按指定长度拆分,这是 Power Query 里的写法:
SPL 里如果按指定长度拆分,方法肯定有。比如,从左往右拆,简单一些,即使后续长度超过了文本本身长度,也会返回空,不会报错:
如果,从右往左拆,就会稍显复杂,需要考虑位置越界的情况,为了拆而拆,不那么优雅了:
增加了 s.split@z 选项表示找到最后一个分割符把串拆成两段
辛苦啦大佬🙏
@r 选项不是按正则拆分吗?
抱歉,写错了,是 @z
大佬,要更新 jar 包吗?我看了下载页面里的 jar 包是 9 月 12 日的。
abcdefg
=((len(A1)-1)\3+1).(mid(A1,#*3-2,3))
=((len(A1)-1)\3).(mid(A1,len(A1)-#*3+1,3))| left(A1,len(A1)%3)
=[1,2,3,4].(mid(A1,cum(~)-~+1,~))
=[1,2,3,4].(mid(A1,max(len(A1)-cum(~),0)+1,max(0,~+min(0,len(A1)-cum(~))))).rvs()
=[1,2,3,4].(left(right(A1,cum(~)),max(0,~+min(0,len(A1)-cum(~))))).rvs()
=[1,2,3,4].(trim(mid(pad@l(A1," ",100),100-cum(~)+1,~))).rvs()
处理越界是比较麻烦些
完善一下 mid 对于负数位置的处理(表示从字符尾部开始数),就可以简单写成
=[1,2,3,4].(mid(A1,-cum(~),~)).rvs()
感谢老贼出手指点,学习了您写的语句,坚信代码的尽头是数学和算法。🙏
若能完善 mid 函数对负数位置的处理,那真的是简直了,期待…
还有一个 sbs 函数,这个文本截取能不能实现负数索引?
SPL yaoyao lingxian!
SPL streets ahead!
下载贴中的 esproc-bin.jar 文件已更新,更新内容如下:
1, 函数 s.split(d) 增加 @z 选项,找到最后一个分隔符 d 将 s 串拆成两段;
2,left(s,n)/right(s,n)/mid(s,n,l) 函数,修改了参数 n 为负数时的计算。
谢谢 74 号大佬,谢谢 14 号大佬,谢谢老贼大神!!!
我试了,好用的很。
Works like magic!!! Yaoyao ahead!!!