2016-08-17 96 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 

你在任何給定的時間在內存中只有一行的方式。但是,由於您爲輸出創建了第二個文件,因此您交易磁盤使用的內存使用量。