【问题标题】:Read strings to array of unknown size将字符串读取到未知大小的数组
【发布时间】:2013-10-22 12:34:34
【问题描述】:

我知道以前有人问过这个问题,但我找不到我正在寻找的答案。 我想遍历一个目录并将所有文件读入一个数组。 我不知道目录包含多少文件,因此我不知道数组的大小。 我实现这一目标的最佳方法是什么? 我读到“ReDim”是性能杀手,但我没有找到任何类似列表的集合......

我错过了什么吗?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    要么

    Redim arr(0) as String
    

    然后

    arr(ubound(arr)) = "newFilename"
    ReDim Preserve arr(ubound(arr)+1)
    

    然后在循环之后

    ReDim Preserve arr(ubound(arr)-1)
    

    将其缩小到最后一个 empty 元素。


    作为使用数组的替代方法。您可以使用CollectionDictionary

    集合在初始化时不需要知道它们的大小。您可以使用他们的Add() 方法添加项目。

    要查看实际的实现示例,请参阅 thisthat


    如果您决定使用 Dir() 函数并迭代以查看有多少文件,这里有一个示例函数

    Sub Main()
    
        ReDim arr(FilesInDirectoryCount("C:\...")) As String
    
    End Sub
    
    Function FilesInDirectoryCount(path As String)
      Dim f As String, c As Long
      f = Dir$(path)
      Do While Len(f) <> 0
        c = c + 1
        f = Dir$
      Loop
      FilesInDirectoryCount = c
    End Function
    

    或者使用这个

    Sub CountFiles()
        Dim strDir As String
        Dim fso As Object
        Dim objFiles As Object
        Dim obj As Object
        Dim lngFileCount As Long
    
        strDir = "C:\path..."
    
        Set fso = CreateObject("Scripting.FileSystemObject")
    
        Set objFiles = fso.GetFolder(strDir).Files
    
        lngFileCount = objFiles.count
    
        MsgBox lngFileCount
    
        Set objFiles = Nothing
        Set fso = Nothing
        Set obj = Nothing
    
    End Sub
    

    【讨论】:

    • 没有。不。不。从不迭代地将数组增长 1。但我喜欢你的收集想法。所以认为这是 +-INT_MAX
    • @Bathsheba 我从未注意到 VBA 将数组大小增加一倍时有任何显着差异或性能下降。我可以阅读更多关于它的链接吗?
    • 我想补充一下你最后的想法。 +1 为你成为第一!
    • 谢谢,使用字典或集合我觉得很奇怪,因为他们使用密钥,而我这里真的没有密钥。只想要一个简单的列表(我知道很多列表的实现都使用ReDim,好笑得自己写)
    • @Bathsheba 如果这是一个由 1000 万个整数组成的数组,那绝对是对的,但它更有可能是一个由 100 个长度为 100k 的字符串组成的数组。在这种情况下,ReDim Preserve 不会增加太多开销。
    【解决方案2】:

    方法一

    一种方法(并且在它经常出现的情况下是标准的)是稍微任意地确定数组的尺寸,但基于平均用例。

    当您即将超过数组大小时,将元素数量重新调整加倍

    然后在最后,将其缩小到实际需要的大小。

    方法 2(双层)

    遍历目录获取大小。然后使用正确大小的数组运行您的代码。由于缺乏原子性,文件系统不可行。尽管在其他用例中,该方法可以很好地工作;不过不要在这里使用它。

    【讨论】:

    • 是的,谢谢,我想避免两次遍历目录。如果我找不到其他方法,我将使用方法 1 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2020-12-16
    相关资源
    最近更新 更多