Excel大型数组查找崩溃
我有一些防火墙日志,我正在查看,我想安排他们,让Excel显示我每个IP的第一个和最后一个时间戳(两个单独的列)。 我有一个五列的表:
- ColumnA:唯一IP地址(计数:1,275)
- ColumnB:我想要第一次访问的时间
- 列C:我希望最后访问的时间是
- ColumnD:非唯一IP地址(数量:300,001)
- 列E:与第4列alignment的非唯一时间戳(计数:300,001)
我的公式似乎在较小的数据集上工作正常,但当我尝试这样做时,excel崩溃,可以理解,因为它是一个40万行的表。 有没有办法使这个CPU的密集度更低,使Excel完成这个? 有没有更好的方法来做到这一点? 这是我正在使用的当前公式:
=MIN(IF(A1=D1:D400001,E1:E400001))
Ctrl + Shift +回车
谢谢!
处理这么多行数据时,最好的办法是创build一个数据透视表(见下面的表格)。 枢轴桌是非常快的,是这样的情况下完美的。
1.将IP地址(非唯一IP地址列)放在“ROWS”上。
2.在“VALUES”上拖动TimeStamps(非唯一时间戳列)。 这将默认为SUM或COUNT,但使用字段设置可以将其更改为MIN。
3再次拖动“VALUES”上的TimeStamps,这次将字段设置更改为MAX。
这个表格实际上会给你与使用MINIF和MAXIF公式相同的结果。
正如Tom Sharpe指出的那样,数据透视表将只列出在“非唯一IP地址”列中find的可能包含或不包含全部1,275个唯一IP地址的IP地址。 为了解决这个问题(如有必要),您可以使用数据透视表本身作为查找表创build一个公式,并将这些值重新转换为原始电子表格。
这个老派的方法怎么样? 我的公式从第2行开始,因为我更喜欢列标题做一个sorting: –
(1)按col Dsorting然后按E
(2)使用MATCH(,, 0)获取B2中每个IP号码和索引的第一个date:
=IFERROR(INDEX(E$2:E$300000,MATCH(A2,D$2:D$300000,0)),"")
(3)使用MATCH(,, 1)获取C2中每个IP号码和索引的最后date:
=IF(B2="","",INDEX(E$2:E$300000,MATCH(A2,D$2:D$300000,1)))
如果B2中的公式没有find匹配,因为A2中的IP地址尚未使用,则在B2和C2中都显示一个空白。
我在一台普通的PC上运行了一些模拟数据,花费了大约5秒的时间进行sorting,并且用相似的时间来更新公式。
值得考虑的数据量较大,因为sorting时间上升为nlog(n),而不是n 2 。
它被标记为Excel,但它也可以被任何SQL数据库轻松处理。