快速统计字符串重复次数

wils

创作者俱乐部成员

昨天遇到个问题: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接口,是不是因此填充速度快得多

有没有感兴趣的朋友也试试看是啥原因😁

海南省
浏览 129
收藏
9
分享
9 +1
7
+1
全部评论 7
 
懒得批爆

@WPS产品体验官

纯纯的技术流
· 四川省
回复
 
风清月霁

创作者俱乐部成员

学习
· 河南省
回复
 
学习
· 广东省
回复
 
学习
· 广东省
回复
 
拉小登Dony

创作者俱乐部成员

太厉害了,学到了
· 山东省
回复
 
黑化新路

WPS函数专家

向老师学习
· 重庆
回复
 
学到了
· 福建省
回复