2016-08-17 98 views
2

我想在vbscript中做一些文本替换。问题是这个文件大小是150MB。以下是删除标题行并删除空白行的功能。在读取大文件时系统内存不足的问题

正如我曾怀疑它给在cleanHeaderRow子行的“内存不足”错误。在这一刻,我不确定这个任务是否可以在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 
+0

文本文件中有多少行? –

+0

Excel有1048576行,所以你可能想尝试在Excel中打开它? –

+0

它不是一个excel文件。它的管道分隔文件有26万行,每行有55列。 –

回答

1

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

例子:

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 

你在任何给定的时间在内存中只有一行的方式。但是,由于您为输出创建了第二个文件,因此您交易磁盘使用的内存使用量。