Excel在大型数组查找时崩溃

时间:2015-08-08 02:47:24

标签: excel excel-formula

我有一些我正在查看的防火墙日志,我想安排它们,以便excel显示每个IP的第一个和最后一个时间戳(两个单独的列)。 我有一个包含五列的表格:

  • ColumnA:唯一的IP地址(计数:1,275)
  • ColumnB:我希望第一次访问的时间是
  • ColumnC:我希望上次访问的时间是
  • ColumnD:非唯一的IP地址(计数:300,001)
  • ColumnE:与第4列对齐的非唯一时间戳(计数:300,001)

我的公式似乎可以在较小的数据集上正常工作,但是当我尝试这样做时,excel崩溃,这是可以理解的,因为它是一个400k的行表。有没有办法减少CPU占用,以便Excel完成此操作?有没有更好的方法来做到这一点?这是我目前使用的公式:

=MIN(IF(A1=D1:D400001,E1:E400001))

CTRL + SHIFT +输入

谢谢!

2 个答案:

答案 0 :(得分:2)

在处理这么多行数据时,最好的办法是创建一个数据透视表(参见下表)。数据透视表非常快,非常适合这种情况。

enter image description here

1. 将IP地址(非唯一IP地址列)放在" ROWS"。

2. 在" VALUES"上拖动TimeStamps(非唯一时间戳列)。这将默认为SUM或COUNT,但使用字段设置您可以将其更改为MIN。

3 再次将TimeStamps拖到" VALUES"这次将字段设置更改为MAX。

这个表几乎可以为您提供与使用MINIF和MAXIF公式相同的结果。

正如Tom Sharpe所述,数据透视表只会列出在非唯一IP地址列中找到的IP地址,该列可能包含也可能不包含所有1,275个唯一IP地址。要解决此问题(如有必要),您可以使用数据透视表本身作为查找表创建公式,并将值重新带回原始电子表格。

答案 1 :(得分:0)

这种老派方法怎么样?我的公式从第2行开始,因为我更喜欢列标题进行排序: -

(1)按照col D排序,然后按E

(2)使用MATCH(,, 0)获取每个IP号码的第一个日期& B2中的INDEX: -

=IFERROR(INDEX(E$2:E$300000,MATCH(A2,D$2:D$300000,0)),"")

(3)使用MATCH(,, 1)获取每个IP号码的最后日期& C2中的INDEX: -

=IF(B2="","",INDEX(E$2:E$300000,MATCH(A2,D$2:D$300000,1)))

如果B2中的公式找不到匹配项,因为A2中的IP地址尚未使用,则在B2和C2中都显示空白。

我在一台普通PC上运行了一些模拟数据,排序时间大约为5秒,更新公式的时间也相似。

值得考虑大量数据,因为排序时间比nlog(n)更高,而不是n 2

它被标记为Excel,但它也可以被任何SQL数据库轻松处理。