【问题标题】:Reading first few characters in large text files in VBA在 VBA 中读取大文本文件中的前几个字符
【发布时间】:2013-09-03 13:59:12
【问题描述】:

我正在尝试在 excel 中读取大 (>15MB) 文件中的前几个字符。现在,我使用的是典型的:

Set MyObject = New Scripting.FileSystemObject
Set mySource = MyObject.GetFolder(mySourcePath)
For Each myFile In mySource.Files
    With New Scripting.FileSystemObject
        With .OpenTextFile(myFile, ForReading)
            test_str = .ReadLine
            'Do things
        End With
    End With
Next

问题在于大文件,我(相信)您将整个内容加载到内存中只是为了读取前几个字符。有没有办法只提取前 6 个字符?

【问题讨论】:

  • 不,它不会加载整个内容。我刚刚ReadLined 观看了一部高清电影,而 Excel 内存消耗/IO 计数非常低。
  • 为什么你认为它正在将整个文件加载到内存中?
  • 我的问题是它会很快循环遍历较小的文件,它会卡在较大的文件上(或者随着时间的推移,也许)。但是现在知道这一点,也许这不是问题。我也在使用: "If Right(myFile.Name, 3) = "txt" Then" 在我的目录搜索中,以确保我正在处理我需要的文件(而不是图片)。这些文件位于网络上。如果我在 excel 关闭之前终止它,我会收到错误消息:“对象 'IFile' 的方法 'Name' 失败”我会进行更多调查并报告...

标签: vba excel


【解决方案1】:

An alternative to the FileSystemObject would be ADO

但是,你的声明

我(相信)您正在将整个内容加载到内存中,只是为了阅读 前几个字符。

错了。

我认为误导您的是,您在阅读第一行后并没有退出循环。您可以通过逐行阅读来获得所需的内容,但您不会立即关闭文件。始终关闭您在代码中启动的任何对象是一种很好的程序员习惯。不要只是让它悬而未决,也不要依赖环境来杀死它们。

考虑下面的代码作为你的替代代码,看看是否有任何效率差异

Option Explicit

' add references to Microsoft Scripting Runtime
' Tools >> References >> Microsoft Scripting Runtime
Sub Main()

    Dim fileName As String
    ' make sure to update your path
    fileName = "C:\Users\FoohBooh\Desktop\Project.txt"

    ReadTxtFile fileName


End Sub

Sub ReadTxtFile(fileName)

    Dim oFSO As New FileSystemObject
    Dim oFS As TextStream

    Set oFS = oFSO.OpenTextFile(fileName)

    Dim content As String
    content = oFS.ReadLine

    With Sheets(1).Range("A1")
        .ClearContents
        .NumberFormat = "@"
        .Value = content
    End With

    oFS.Close
    Set oFS = Nothing

End Sub

上面的代码将 .txt 文件的第一行读入第一张表的单元格 A1。请记住将 fileName 变量设置为完整路径。

【讨论】:

  • Don't just leave it hanging and don't rely on the environment to *kill* them - 我以前也是这样想的。然后我意识到这是a)愚蠢和b)太乏味而无法正确。例如。您显示的代码并不比 OP 的代码好,因为如果在 Set oFS = ...Set oFS = Nothing 之间发生异常,您的清理代码将不会运行,因此您会将对象留给环境 kill。 VBA 具有确定性的基于引用计数的破坏,您应该依赖它,因为它是确定性的。添加显式.Closes 只会提供更正确代码的错误感觉。
  • @GSerg 显然这是一个演示。如果我要复习错误处理,我还不如写一本书。我很高兴您添加了您的评论 - 我同意,这很有帮助,尽管错误处理是另一个我们可以写几个小时的广泛主题 - 特别是考虑到 VBA 与其他语言相比并不擅长它这一事实,不要尝试{} , catch{}, finally{} 块存在于 VBA 中
猜你喜欢
  • 2016-07-31
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
相关资源
最近更新 更多