我收到了大量的元数据 Excel(主表至少有 100,000 行,最多有 100 万行;列数从 10 到 30 不等),其中包含我需要根据唯一标识符(存在于主表的第一列中)提取的数据。目前,我使用 LOOKUP 查找我的唯一标识符并提取新工作表所需的关联列。但是,由于我提取了 1 列以上(从 3 到 6),计算速度非常慢(计算我的工作表需要 30 分钟或更长时间)。
我用这个公式
=IF(IF(LOOKUP(A2;STORED_NAME)=A2;"yes";"no")="yes";TRIM(LOOKUP(A2;STORED_NAME;FILENAME));"#####")
我也尝试过 VLOOKUP,但计算速度也非常慢。过滤也是另一个噩梦,需要很长时间。
你有什么建议吗?我应该继续使用 Excel 并使用其他公式吗?或者我应该研究其他可以自动化该过程的东西(另一个程序、另一种语言等)吗?
提前致谢
答案1
使用 30 列、29 列数据,其中一列包含MOD()
超过一百万个单元格的公式,为我提供了一个简单的基础,让我可以通过不同的选择来测试新输出的填充速度,以下公式从来不会感觉需要一秒钟才能返回正确的输出集:
=FILTER( INDEX(A:AD, ROW(1:1048576), {1,25}), C:C=3)
INDEX()
获取数据表并从中选择两列,当然,只需要从中选择包含所需数据的列作为FILTER()
基于条件的过滤器,而不管第一个参数是什么(我在其中使用了INDEX()
)。事实上,对于单个列或一组连续的列,INDEX()
甚至不需要,只需要一个简单的范围引用:
=FILTER( Y:Y, C:C=3)
我使用该INDEX()
函数只是为了测试更大的列集和不连续的列集,以查看它们如何以及是否会延迟响应。我原以为不连续的选择是最耗时的,但简单地选择最多的列进行返回实际上是最耗时的。
对于全部 30 个满的列(每列 1,048,576 个满的单元格),更改选择参数最多只需 4 秒即可重新填充。对于所有包含的列,删除该INDEX()
函数,仅指定 A:AD,所用时间不会超过 2 秒,可能为 3 秒。
您在帖子中提到了“过滤”。我从未尝试过任何形式的非公式化过滤,因为我相信那是您所指的过滤类型,并且假设您报告的对过滤的不满是正确的。这里的过滤完全是公式化的。
我确信,如果许多单元格包含 Excel 会根据FILTER()
条件参数的变化重新计算的公式(例如易失性函数,而非易失性函数(如我的MOD()
公式列)则不会),则结果可能需要更长时间才能得出。但您说的是“数据”,这意味着根本没有公式,所以……不要认为您的数据与我将其输入到输出中的 Excel 测试数据有实质性的不同。
您的挫败感也可能发生在下游,输出集的创建并不是真正的问题,而是依赖于它的公式可能导致它必须重新计算。响应时间最多为 4 秒,即使这样似乎也不会导致 30 分钟的等待时间,所以我看不出有什么方法可以太有效地解决这种可能性。
我认为使用时最后一个大问题FILTER()
是,你可能有一组非常复杂的条件,甚至可能迫使 Excel 在条件计算的下一层公式中创建一个又一个的输出集。由于我们不知道这些细节,因此显然不知道细节,我无法解决这个问题。不过,如果你的输出选择条件足够复杂,你似乎不会在帖子中遗漏这样的内容,因为这肯定是显而易见的。