2016-08-17 2 views
2

vbscript에서 텍스트 대체를 시도하고 있습니다. 문제는 파일 크기가 150MB라는 것입니다. 다음은 헤더 행을 삭제하고 빈 행을 제거하는 함수입니다.대용량 파일을 읽는 동안 vbscript에서 시스템 메모리 부족 문제가 발생했습니다.

내가 strContents = objTS.ReadAllcleanHeaderRow sub에 "out of memory"오류를 내고 있다고 의심했기 때문에. 이 작업이 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

파일이 아닙니다. 26 만 개의 행을 가진 파이프로 구분 된 파일이고 각 행에는 55 개의 열이 있습니다. –

답변

1

모두 당신의 절차는 서로 다른 방법으로 그 일을하고, 비록 메모리에 전체 파일을 읽습니다. 대용량 파일을 처리하는 올바른 방법은 파일을 열어서 한 줄씩 처리하고 입력을 읽을 때 출력을 임시 파일에 쓰고 원본 파일을 임시 파일로 바꾸는 것입니다.

예 :

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 

당신이 어떤 주어진 시간에 메모리에 하나 개의 라인을 가지고 그런 식으로. 그러나 출력을 위해 두 번째 파일을 작성하기 때문에 디스크 사용량에 대한 메모리 사용량을 조정해야합니다.

관련 문제