动态数组的困惑

3

好的,我正在使用以下代码来读取和显示文本文件到一个HTA(HTML应用程序)中,它通过循环遍历文件夹(Notes)中存在的所有文本文件。我已经解析了换行符,并从显示中删除了文件扩展名。

我想要做的是构建两个数组,一个用于文件名,一个用于文本文件内容,以便在脚本的其他部分中按需要输出它们。

我知道我需要一个动态数组,在循环中它需要扩展intsize,只是我不确定如何实现,特别是因为它可能是一个二维数组,以将文件名和其内容放在一起。这是代码:

Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "Notes\"

Set objFolder = objFSO.GetFolder(objStartFolder)

Set colFiles = objFolder.Files
   For Each objFile in colFiles
   If UCase(objFSO.GetExtensionName(objFile.name)) = "TXT" Then

        Files = objStartFolder & objFile.name
        Set objReadFile = objFSO.OpenTextFile(Files, 1)

        strExt = Left(objFile.name, Len(objFile.name)-4)
        strNote = Replace(objReadFile.ReadAll, vbCRLF, "<br>")

    objReadFile.Close

        document.write strExt & "<br><br>"
        document.write strNote & "<br><br>"

    else
    document.write ="File was empty"

    End If
Next

1
或者使用字典。 - 404
1
@eurotrash 为了性能考虑,建议使用数组而不是COM对象。 - user692942
1个回答

3
你应该可以使用二维数组来轻松完成这个任务。
因为你事先知道文件的数量,所以不需要使用`Preserve`来动态地调整数组大小,只需声明一个动态数组,然后使用`ReDim`来设置初始维度即可。
Dim data()

...

Dim index
ReDim data(1, colFiles.Count - 1)

For Each objFile in colFiles
  ...
  data(0, index) = objFile.Name
  data(1, index) = strNote
  index = index + 1
Next
Erase data

更新:

因为上述代码如何适应他们的示例不清楚,所以 OP 希望提供一个完整的示例,因此下面是示例:

... 表示省略的现有代码以强调添加内容

Option Explicit

Dim objFSO, objFolder, colFiles, objFile, objReadFile
Dim objStartFolder, Files, strExt, strNote

Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "Notes\"

Set objFolder = objFSO.GetFolder(objStartFolder)

Dim data(), index

Set colFiles = objFolder.Files
'No need for preserve as we have the Count from the colFiles File Collection.
ReDim data(1, colFiles.Count - 1)

For Each objFile in colFiles
  If UCase(objFSO.GetExtensionName(objFile.name)) = "TXT" Then
    Files = objStartFolder & objFile.name
    Set objReadFile = objFSO.OpenTextFile(Files, 1)

    strExt = Left(objFile.name, Len(objFile.name)-4)
    strNote = Replace(objReadFile.ReadAll, vbCRLF, "<br>")

    objReadFile.Close
    'Release resources
    Set objReadFile = Nothing

    document.write strExt & "<br><br>"
    document.write strNote & "<br><br>"
    
    'Populate the array
    data(0, index) = objFile.Name
    data(1, index) = strNote
    index = index + 1    
  Else
    document.write ="File was empty"
  End If
Next
'Release resources
Erase data
Set colFiles = Nothing
Set objFolder = Nothing
Set objFSO = Nothing

此代码未经测试

我已经用一个示例进行了测试,您可以使用CScript进行调用

Option Explicit
Dim fs, folder, files, file
Dim i, r, c

Set fs = CreateObject("Scripting.FileSystemObject")

Set folder = fs.GetFolder("C:\")
Set files = folder.Files

Dim data()

ReDim data(1, files.Count -1)

For Each file In files
  data(0, i) = file.Name
  data(1, i) = file.Path
  i = i + 1
Next

For r = LBound(data, 2) To UBound(data, 2)
  For c = LBound(data, 1) To UBound(data, 1)
    WScript.Echo "data(" & c & ", " & r & ") = " & data(c, r)
  Next
Next
Erase data
Set files = Nothing
Set folder = Nothing
Set fs = Nothing

使用命令行运行此代码,使用cscript.exe而不是wscript.exe, 否则会出现很多弹窗。


抱歉,Lankymart,我对逻辑语句、设置变量和基本代码没问题,但是数组有点让我困惑。我需要比这更详细的解释才能理解。你能否编辑你的帖子并将你的代码与我的代码结合,并解释输出数据的方法(例如使用innerhtml,甚至只是一个变量)。另外,数组的大小仅受“Notes”目录中txt文件数量的限制。 - Ctrlaltdenied
@Ctrlaltdenied 代码应该只需围绕您现有的代码进行修改,稍后再修改答案。目前不在,正在使用手机评论。 - user692942
好的,伙计。我想我知道它将会去哪里,但我还不太理解数组以及它们如何被操作。我更想了解我放进去的东西是什么。谢谢,请不用担心。 - Ctrlaltdenied
1
@Ctrlaltdenied 当涉及到二维数组时,最简单的思考方式就是将其视为表格中的列和行。第一维是列,第二维是行,因此在这个例子中,您有2列和由colFiles.Count - 1决定的任意行数。 - user692942

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接