vbscript - 读取大文件时 vbscript 中的系统内存不足问题

标签 vbscript

我正在尝试在 vbscript 中进行一些文本替换。问题是该文件有 150MB 大。下面是仅删除标题行并去除空行的函数。

正如我所怀疑的那样,它在 cleanHeaderRow 子中的 strContents = objTS.ReadAll 行给我一个错误“内存不足”。目前我不确定这个任务是否可以在 VBScript 中完成。但在我开始探索其他语言之前,我们非常欢迎任何类型的建议。

Sub cleanHeaderRow(browse)
    MsgBox browse
    Const FOR_READING = 1
    Const FOR_WRITING = 2
    'strFileName = "C:\scripts\test.txt"
    strFileName = browse
    iNumberOfLinesToDelete = 1

    Set objFS = CreateObject("Scripting.FileSystemObject")
    Set objTS = objFS.OpenTextFile(strFileName, FOR_READING)
    strContents = objTS.ReadAll
    objTS.Close

    arrLines = Split(strContents, vbNewLine)
    Set objTS = objFS.OpenTextFile(strFileName, FOR_WRITING)

    For i=0 To UBound(arrLines)
        If i > (iNumberOfLinesToDelete - 1) Then
            objTS.WriteLine arrLines(i)
        End If
    Next
End Sub

Sub DeleteBlankRows(browse)
    Const ForReading = 1
    Const ForWriting = 2
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile(browse, ForReading)
    Do Until objFile.AtEndOfStream
        strLine = objFile.Readline
        strLine = Trim(strLine)
        If Len(strLine) > 0 Then
            strNewContents = strNewContents & strLine & vbCrLf
        End If
    Loop
    objFile.Close
    Set objFile = objFSO.OpenTextFile(browse, ForWriting)
    objFile.Write strNewContents
    objFile.Close
End Sub

最佳答案

您的两个过程都将整个文件读入内存,尽管它们是以不同的方式进行的。处理大文件的正确方法是打开文件,逐行处理,在读取输入时将输出写入临时文件,然后用临时文件替换原始文件。

例子:

filename = "..."

Set fso = CreateObject("Scripting.FileSystemObject")

Set inFile  = fso.OpenTextFile(filename)
Set outFile = fso.OpenTextFile(filename & ".tmp", 2, True)
Do Until inFile.AtEndOfStream
  If inFile.Line = 1 Then
    inFile.SkipLine                            'skip first line
  Else
    line = inFile.ReadLine
    If line <> "" Then outFile.WriteLine line  'write non-empty lines to output
  End If
Loop
inFile.Close
outFile.Close

fso.DeleteFile filename, True
fso.MoveFile filename & ".tmp", filename

这样一来,在任何给定时间,您的内存中都只有一行。不过,您可以用内存使用换取磁盘使用,因为您为输出创建了第二个文件。

关于vbscript - 读取大文件时 vbscript 中的系统内存不足问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39002907/

相关文章:

windows - 如何在弹出窗口中定义按钮值?

windows - 如何检查哪个操作系统?

vbscript - VBScript中的UTC时间分配

javascript - 从 html 源代码中删除 vbscript 或停用 vbscript

windows - 修复 vbs 以启动隐藏系统文件检查器

vbscript - VBscript 自动格式化工具

xml - 尝试在 VBScript 中使用 XPATH 解析 XML 时获取空值

internet-explorer - 从文本文件读取域并在浏览器中打开

service - 如何使用vbscript检查服务状态?

date - 如何在 vbscript/ASP 中比较两个日期?