快速统计字符串重复次数

wils
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接口,是不是因此填充速度快得多

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

海南省
浏览 493
收藏
9
分享
9 +1
10
+1
全部评论 10
 
叶文荣
大厉害了👍
· 四川省
回复
 
愁小白
大佬还是大佬!什么样的工作环境需要1000万个单元格。
· 江苏省
回复
 
EnterZero
EnterZero

创作者俱乐部成员

提速灵感启发啊
· 四川省
回复
 
懒得批爆
懒得批爆

WPS产品体验官

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

WPS产品体验官

学习
· 河南省
回复
 
一场凉凉雪
学习
· 广东省
回复
 
亂雲飛渡
学习
· 广东省
回复
 
拉小登Dony
拉小登Dony

创作者俱乐部成员

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

WPS函数专家

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