【问题标题】:Fast way to count duplicates in 30000 rows (Libreoffice Calc)快速计算 30000 行中的重复项(Libreoffice Calc)
【发布时间】:2019-04-07 03:06:56
【问题描述】:

其实我已经有了部分答案!!!带有“单元格值是”->“重复”的条件格式!!! 这样就可以“实时”对每个用户的新条目进行检查。

我需要检查一列的 30000 行中是否存在重复条目(任何值,但不是空白!)。我想跟踪填充过程中有多少重复。

好的,条件格式是一种非常有效的视觉指示,并且速度足以满足我的需求,但是由于我无法执行循环来检查单元格的颜色(发现有些人反对这种方法!会很容易!)我需要找到一种替代方法来计算重复项(作为一个整体,无需确定每种情况有多少!)。

我试过公式:

=SUMPRODUCT((COUNTIF(F2:F30001;$F$2:$F$30001)>1))

有效,但需要两分钟才能完成。

如果你想复制我的案例。我的 30000 个条目的格式为:字母“A”和介于 100000 和 999999 之间的数字,例如 A354125、A214547 等。将“=CONCATENATE("A";RANDBETWEEN(100000;999999))”的结果复制为文本以保存时间。

谢谢!

PS:有人知道用于在条件格式中查找重复项的算法(它很快)吗?

宏观解决方案不是最好的,但可以接受! ;)

【问题讨论】:

    标签: arrays formatting duplicates conditional libreoffice-calc


    【解决方案1】:

    =SUMPRODUCT((COUNTIF(F2:F30001;$F$2:$F$30001)>1)) 必须执行以下操作:如果 $F$2F2:F30001 中,则计数,如果 $F$3F2:F30001 中,则计数,...,然后在 $F$30001F2:F30001 中时计数。所以它必须完全循环数组F2:F30001 与每个项目。

    计算数组中重复项的最快方法是避免使用每个单项对数组进行完全循环。一种方法是先排序。有非常快速的快速排序方法。或者使用每个定义只能有唯一项目的集合。

    以下代码使用第二种方式。 Collection 的键必须是唯一的。添加具有重复键的项目失败。

    Public Function countDuplicates(vArray As Variant, Optional inclusive As Boolean ) As Variant
     On Error Goto wrong
     If IsMissing(inclusive) Then inclusive = False
     oDuplicatesCollection = new Collection
     oUniqueCollection = new Collection
     lCountAll = 0
     For Each vValue In vArray
      If contains(oUniqueCollection, CStr(vValue)) Then
       On Error Resume Next
        oDuplicatesCollection.Add 42, CStr(vValue)
       On Error Goto 0
      Else
       oUniqueCollection.Add 42, CStr(vValue)
      End If
      lCountAll = lCountAll + 1
     Next
     countDuplicates = lCountAll - oUniqueCollection.Count + IIF(inclusive, oDuplicatesCollection.Count, 0)
     Exit Function
    wrong:
     'xray vArray
     countDuplicates = CVErr(123)
    End Function
    
    Function contains(oCollection As Collection, sKey As String)
     On Error Goto notContains
     oCollection.Item(sKey)
     contains = True
     Exit Function
    notContains:
     contains = False
    End Function
    

    函数可以调用:

    =COUNTDUPLICATES(F2:F30001, TRUE())
    

    这应该返回与您的结果相同的结果

    =SUMPRODUCT((COUNTIF(F2:F30001,$F$2:$F$30001)>1))
    

    可选的第二个参数inclusive 表示计数包括多次出现的所有值。例如 {A1, A2, A2, A2, A3} 包含 3 次 A2。包括在内表示计数结果为 3。不包括在内表示计数结果为 2。A2 有 2 次重复。

    如您所见,该函数包含的信息远不止重复次数。 oDuplicatesCollection 包含每个重复项。 oUniqueCollection 包含每个独特的项目。因此,此代码还可用于获取所有唯一项目或所有重复项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多