如何在Excel中删除大小写敏感的重复项(对于100k条logging或更多)?
我已经尝试使用这个公式字段,并复制到所有> 100Klogging我有。
= IF(SUMPRODUCT( – EXACT(A2,$ B $ 1:B1)), “”,A2)
哪里:
- 列A =所有数据包括重复的列
- 列B =列显示数据(来自列A)如果唯一的,否则为空string
但是我遇到这个问题:
是的,我的Excel 2016是32位,是的,我的笔记本电脑只有8GB内存。 但是我已经读了64位和16GB内存的用户和我一样的错误。
我知道Excel函数中有一个函数:Data> Select Column(s)> Remove Duplicates。 但是,该function只能删除大小写INSENSITIVE数据。
请告诉我如何解决这个问题。 我很乐意使用像Crystal Reports或某种免费软件来解决这个问题。 请指教。
你可以尝试这样的事情。 在尝试这个备份你的数据之前。 下面的代码将删除列A中的重复项,并区分大小写。
Sub GetUniqueValues() Dim x, dict Dim lr As Long lr = Cells(Rows.Count, 1).End(xlUp).Row x = Range("A2:A" & lr).Value Set dict = CreateObject("Scripting.Dictionary") For i = 1 To UBound(x, 1) dict.Item(x(i, 1)) = "" Next i Range("A2:A" & lr).ClearContents Range("A2").Resize(dict.Count).Value = Application.Transpose(dict.keys) End Sub
编辑的代码:
Sub GetUniqueValues() Dim x, dict, y Dim lr As Long Application.ScreenUpdating = False lr = Cells(Rows.Count, 1).End(xlUp).Row x = Range("A2:A" & lr).Value Set dict = CreateObject("Scripting.Dictionary") For i = 1 To UBound(x, 1) dict.Item(x(i, 1)) = "" Next i ReDim y(1 To dict.Count, 1 To 1) i = 0 For Each it In dict.keys i = i + 1 y(i, 1) = it Next it Range("A2:A" & lr).ClearContents Range("A2").Resize(dict.Count).Value = y Application.ScreenUpdating = True End Sub
对于一般的解决scheme,VBA方法已经提出可能更喜欢。 但是对于只有一次作用的东西,你可以按照你想要的方式进行工作,只需要适应一点就可以适用=IF(SUMPRODUCT(--EXACT(A2,$B$1:B1)),"",A2)
。 我也尝试使用比SUMPRODUCT快得多的COUNTIFalgorithm,但是不区分大小写。
由于我也运行8位内存的32位Excel,我很好奇,看看我是否可以复制内存问题。 我在列A中生成了10万个随机的5个字母的string的列表。只有10个字母被使用(ABCDEFGHJK),所以在100,000个string中会有一个以上发生。 然后,我应用OP列在B列中的公式来筛选出唯一的值。 它确实有效,但花了相当长的一段时间。 但是我从来没有遇到OP所做的记忆问题。
build议解决scheme:
根据这些观察结果,针对您的特定问题的一种可能的解决scheme可能是将列A复制到新的临时工作簿,并在其他所有工作簿closures时在其中运行您的SUMPRODUCT公式。 一旦完成,您可以将结果粘贴回原始文件中的原始列。 实际上删除重复可以通过对该列进行简单筛选来完成,以便将所有dublicates(空单元)分组在一起,然后删除这些行。 我的复制尝试细节可以在下面find。
SUMPRODUCT:大约1小时
首先,我尝试了与OP中相同的公式: =IF(SUMPRODUCT(--EXACT(A2,$B$1:B1)),"",A2)
,但是一次只能处理10,000行(插入空行一万行,二万行等,一次只能复制一万行)。每行10,000行花了几分钟的时间完成。 当我把整个文件作为一个庞大的复制操作,对所有100,000个单元格一次,操作需要大约一个小时才能完成,同时Excel没有响应。 内存使用量为1,4 GB,CPU平均容量超过50%(使用Windows任务pipe理器进行监控)。 当我已经以各种方式操作数据(从而消耗更多的内存)时,我也尝试运行公式,这将CPU容量推到了100%,并导致了一些崩溃。 我设法通过简单地closuresExcel来清除内存,并在没有打开其他工作簿的情况下重新运行该操作。
正如你在下面的屏幕截图中看到的那样,公式工作,唯一的条目变得越来越less(如预期的那样,因为它们是随机的)。 我将1分配给重复的单元格,所以我可以很容易地计算它们。 有36,843个这样的例子。
第一行,不重复:
最后一行,大部分是重复的(单元格为1):
COUNTIF:8.5分钟
与SUMPRODUCTalgorithm相比,花了大约一个小时才能完成,以下COUNTIF公式只需8.5分钟即可完成相同的工作,但不能区分大小写。 这种方法需要使用帮助栏。 COUNTIF返回在当前单元格上方范围内使用特定string的实例数,因此每次遇到第一次string时,它将返回1.单元格B2包含=COUNTIF($A$2:$A2,A2)
,并拷贝所有100,000行花了大约八分半钟。 然后,在一个单独的柱子中,我只是使用一个简单的IF公式来过滤掉A列中的唯一值; 单元格C2包含=IF(B2=1,A2,1)
,它返回列A中的string,如果它是唯一的; 否则返回1(以便于与SUMPRODUCT进行比较)。 将所有100,000行的IF公式复制下来实际上是瞬间的。 在这个操作之后,C列中的1的总和,和SUMPRODUCT的情况一样,是36,843。
INDEX:失败
我也使用INDEX和MATCH函数玩弄了一个数组公式。 此公式与COUNTIF执行相同的工作,但也过滤出空行: =INDEX($A$2:$A$100001,MATCH(0,COUNTIF($E$1:E1,$A$2:$A$100001),0))
。 这应该在数组公式中input(Ctrl + Shift + Enter),然后复制下来。 一次只复制一个单独的单元格对于几十行工作得很好,但是超过这个数字就会导致Excel崩溃。 我甚至试图在一夜之间运行,但操作从未完成。 (公式可以扩展为区分大小写,但我没有打扰尝试。)
但是,有一点需要注意的是,INDEX公式失败的原因是上面描述的行为发生在公式应用于单独的工作簿中时。 我也尝试在与COUNTIF公式相同的工作簿中的D列中运行此公式。 然后,我确实遇到了OP中描述的内存问题,毫不奇怪,这意味着内存问题取决于工作簿中的其余数据。