2015-08-14 62 views
0

我正在使用此代碼將字符串寫入TXT文件。Scripting.FileSystemObject在寫入方法上內存不足

它適用於文件< 40mbs然而,我試圖保存的TXT會有點大~45mb,並且在獲取到.write行時出現「內存不足」的錯誤。

Private Sub SaveToTXT(FilePath As String, FileContents As String) 
    Dim fso As Object 
    Dim oFile As Object 
    FileManagementFactory.DeleteIfExists (FilePath) 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set oFile = fso.CreateTextFile(FilePath) 
    Call oFile.Write(FileContents) 
    Call oFile.Close 
    Set fso = Nothing 
    Set oFile = Nothing 
End Sub 

任何想法如何繞過這個問題?

+0

使用OpenTextFile方法,它允許您附加到文件。那麼你可以分割字符串並將其寫入塊中。 https://msdn.microsoft.com/en-us/library/314cz14s(v=vs.84).aspx – Sorceri

回答

0

在這裏,試試這個。

Private Sub SaveToTXT(FilePath As String, FileContents As String) 
    Dim nFileNum As Integer: nFileNum = FreeFile 
    Open FilePath For Binary Lock Read Write As #nFileNum 
    Put #nFileNum, , FileContents 
    Close #nFileNum 
End Sub 
+0

我認爲寫每一行比寫一次要慢很多。例如,我可能會嘗試每寫一行10000行。 – lisovaccaro

+0

這正是我想要的,你知道我如何分割它每N行例如?所以我把它寫成兩三個字。而不是一行一行地寫? – lisovaccaro

+0

真的沒有其他選擇。你可以嘗試ADO,但這是關於所有。第二種選擇是放棄VBA並使用VB.Net來做你所需要的。 –

0

這就是我最後做的,它將文件以20,000,000個字符串分隔開。在我的測試中,它似乎超過了內存限制。

Private Sub SaveToTXT(FilePath As String, FileContents As String) 
    Dim fso As Object 
    Dim oFile As Object 
    Dim l As Long 
    Dim CharactersPerChunk As Long 
    CharactersPerChunk = 20000000 
    FileManagementFactory.DeleteIfExists (FilePath) 
    Set fso = CreateObject("Scripting.FileSystemObject") ' A lot faster than ADODB.Stream 
    Set oFile = fso.CreateTextFile(FilePath) 
    l = 0 
    While l < Len(FileContents)/CharactersPerChunk 
     Call oFile.Write(Mid(FileContents, (l * CharactersPerChunk) + 1, CharactersPerChunk)) 
     l = l + 1 
    Wend 
    Call oFile.Close 
    Set fso = Nothing 
    Set oFile = Nothing 
End Sub 
+0

您是否嘗試過我上次編輯後張貼的二進制寫入功能?它有一些錯誤,但我修正了這些錯誤。 –

+0

我沒有時間去嘗試,我會嘗試在接受答案之前測量哪個更快。 – lisovaccaro

+0

你應該繼續嘗試我剛剛發佈的更新代碼。它超高效,運行速度比上面提到的要快(〜171毫秒vs 343毫秒)讓我知道它是否也解決了內存問題。 –