当前位置: 首页 > 知识库问答 >
问题:

如何计算openoffice/libreoffice basic中的重复条目?

文建业
2023-03-14

我在LibreOffice的许多工作表上有大量的数据--一个地址列和一个数据列--我想计算每个地址出现的次数,放入num_addr列中。例如:

ADDR             | DATA             | NUM_ADDR
00000000bbfe22d0 | 876d4eb163886d4e | 1
00000000b9dfffd0 | 4661bada6d4661ba | 1
00000000b9dfc3d0 | 5d4b40b4705d4b40 | 1
00000000b9def7d0 | 8f8570a5808f8570 | 1
00000000b9de17d0 | 63876d4eb163886d | 1
00000000b9dddfd0 | 6d4eb163886d4eb1 | 3
00000000b9dddfd0 | 705d4b40b4705d4b | 
00000000b9dddfd0 | b4705d4b40b4705d | 
00000000b7df83d0 | 40b4705d4b40b470 | 1
00000000b7d607d0 | 705d4b40b4705d4b | 1
...
Dim CountedAddr(RowCounter, RowCounter) as String
Dim CountedAddrPtr as Integer
Dim CurrentCell as Object
Dim i as Integer

CountedAddrPtr = 0

' Populate CountedAddr array
For i = 1 to RowCounter-1
  CurrentCell = CurrentSheet.getCellByPosition(0, i)
  If Not CurrentCell.String In CountedAddr(?) Then
    CurrentSheet.getCellByPosition(2, i).Value = 1 ' for debugging
    CountedAddr(CountedAddrPtr, 0) = CurrentCell.String
    CountedAddrPtr = CountedAddrPtr + 1
  Else
    CurrentSheet.getCellByPosition(2, i).Value = 0 ' for debugging
  EndIf
Next

' For each unique address, count number of occurances
For i = 0 to UBound(CountedAddr())
  For j = 1 to RowCounter-1
    If CurrentSheet.getCellByPosition(0, j).String = CountedAddr(i, 0) Then
      CountedAddr(i, 1) = CountedAddr(i, 1)+1
    EndIf
  Next
Next

' Another function to populate NUM_ADDR from CountedAddr array...

共有1个答案

满俊楠
2023-03-14

字典类型的对象(如VB6集合)对于查找项是有效的,因为它直接查找键,而不是在长数组中循环。下面的countedaddrs集合将存储每个地址的计数。

Sub CountAddrs
    Dim countedAddrs As New Collection
    Dim oCurrentSheet As Object
    Dim oCurrentCell As Object
    Dim currentAddr As String
    Dim i As Integer
    Dim newCount As Integer
    Dim rowCounter As Integer
    Const ADDR_COL = 0
    Const COUNT_COL = 2

    oCurrentSheet = ThisComponent.CurrentController.ActiveSheet
    rowCounter = 11
    ' Populate countedAddrs array.
    For i = 1 to rowCounter - 1
      oCurrentCell = oCurrentSheet.getCellByPosition(ADDR_COL, i)
      currentAddr = oCurrentCell.String
      If Contains(countedAddrs, currentAddr) Then
        ' Increment the count.
        newCount = countedAddrs.Item(currentAddr) + 1
        countedAddrs.Remove(currentAddr) 
        countedAddrs.Add(newCount, currentAddr)
        oCurrentSheet.getCellByPosition(COUNT_COL, i).Value = newCount ' for debugging
      Else
        countedAddrs.Add(1, currentAddr)
        oCurrentSheet.getCellByPosition(COUNT_COL, i).Value = 1 ' for debugging
      EndIf
    Next
End Sub

这段代码需要下面的helper函数。在大多数语言中,dictionary对象都内置了这个功能,但是Basic比较简单。

' Returns True if the collection contains the key, otherwise False.
Function Contains(coll As Collection, key As Variant)
    On Error Goto ErrorHandler
    coll.Item(key)
    Contains = True
    Exit Function
ErrorHandler:
    Contains = False
End Function
 类似资料:
  • 我有两个表,称为和。我正在努力计算每个系可用的教官人数。我会附上数据库表的截图。 我们如何使用SQL查询计算每个部门可用的讲师数量? 而且,在同一个查询中,我想显示所有的部门。

  • 问题内容: 我需要分离并计算arraylist中有多少个相同的值,并根据出现的次数进行打印。 我有一个名为digits的arraylist: 我创建了一个将每个值分开并将其保存到新数组的方法。 之后,我得到了一个名为数字的新数组。我在此数组上使用排序 和我的ArrayList看起来像这样: 它具有: 我需要根据数字的多少来打印出数字字符串,所以它看起来应该像这样:1354678290 问题答案:

  • 在过去,我经常通过pandas数据帧计算条件语句,该数据帧将Y/N返回到1/0,然后计算并获得分数。不过,我想学习一种高级方法,用列表中较大的数据集实现计算。 这是我的代码: 输出: 但是这是针对3个列表(a, b, c)的index,但是我需要手动执行列表的其余索引。 如何为给定列表的所有索引自动执行? 当我在完整列表中使用这种格式时: 我得到这样的错误: 会感激任何帮助。

  • 问题内容: 我想计算数组中每个重复项的出现,最后得到一个唯一的/非重复项及其各自出现的数组。 这是我的代码;但是我没有错! 问题答案: , 请享用 :-) 结果:

  • 问题内容: 目前,我得到了这样的数组: 经过几步,我的数组如下所示: 我如何计算数组中有多少个a,b,c?我想要一个类似的结果: 等等 问题答案: function count() {

  • 我是新来的Laravel,我需要通过分组来计算值,例如,我有这些值 我需要计算列中有多少个1,我希望结果是男性:3,女性:2 我试过这种方法,但效果不理想