快速统计字符串重复次数
创作者俱乐部成员
昨天遇到个问题:A列是一些字符串,要在B列逐行统计字符串重复出现的次数
即在B列下拉公式=COUNTIF($A$1:A1,A1)得到的结果
但问题是,当A列达到数万行,比如2万行时,每次下拉wps左下角会出现进度条
虽然是多线程计算,仍需要等待10秒左右才能完成
现在需要秒出结果的方法
一开始想到的是awk命令,写起来十分简单
🔔 | awk '{print ++d[$0]}' a.txt |
如图,1千万行用了10秒,2万行确实秒出结果
原理就是用字典d进行计数,避免了重复countif
改写成js宏大概如图:
以自定义公式的方式使用,可以秒出结果
再进一步,如果不使用js宏,只用动态数组公式行不行
刚开始还是在动态数组公式里使用countif,很慢
大概是因为countif本身重复计数了太多次
那么不使用countif试试,于是如下:
🔔 | =LET(a,A1:A20000,b,SORT(HSTACK(SEQUENCE(ROWS(a)),a),2),c,GROUPBY(a,a,COUNTA,0,0,1),d,DROP(REDUCE(0,INDEX(c,,2),LAMBDA(x,y,VSTACK(x,SEQUENCE(y)))),1),INDEX(SORT(HSTACK(b,d)),,3)) |
确实秒出结果了,不过好丑🤣,大概就是避开了countif的重复计数
最后,还有一个发现,在linux里即使下拉公式的速度也非常快,如上面2万行的填充,win10里耗时10秒,linux里耗时2秒左右
另外,如果使用js宏向表格填充数据,比如填充1千万单元格,明显感觉linux比win10快一倍以上
曾经用ahk做试验,如果生成一个safearray再填充wps,速度和excel是一样的,但如果填充js数组,则慢一半,所以当时猜测js数组会被转为safearray再填充
但linux不需要兼容com接口,是不是因此填充速度快得多
有没有感兴趣的朋友也试试看是啥原因😁
@WPS产品体验官
创作者俱乐部成员
创作者俱乐部成员
WPS函数专家