2016-11-09 65 views
0

我是一個新用戶,並與下方掙扎:閱讀/寫作大文件VB.NET

我需要讀取該文件,並與一些修改,寫回,問題是:

  1. 「ReadToEnd」適用於較小文件[約100MB],一切正常,我喜歡做的事情。 但是對於更大的文件[300 MB +],它會彈出。
  2. 然後我嘗試「的ReadLine」(讀逐行) 它適用於更小的或更大的文件不錯,但它需要非常非常長的救回來。

我既包括下面的「ReadToEnd的」和「的ReadLine」 代碼測試你的需要創建「100MB-FILE.TXT」和「300MB-FILE.TXT」文件在C:\ TEMP \區域。

我真的很感激在這方面

'----------------Reading whole File ReadToEnd 
Dim sr As New StreamReader("C:\temp\100MB-File.txt") 
Dim path As String = "C:\temp\myFileNew1.txt" 
Dim oneLine As String 
oneLine = sr.ReadToEnd 
Using sw As StreamWriter = File.CreateText(path) 
    sw.WriteLine(oneLine) 
End Using 
sr.Close() 

''---------------Reading Line by Line 
Dim sr As New StreamReader("C:\temp\300MB-File.txt") 
Dim path As String = "C:\temp\myFileNew2.txt" 
Dim oneLine As String 
oneLine = sr.ReadLine 

Using sw As StreamWriter = File.CreateText(path) 
    sw.WriteLine(oneLine) 
End Using 

Do Until sr.EndOfStream 
    Console.WriteLine(oneLine) 
    oneLine = sr.ReadLine() 

    Using sw As StreamWriter = File.AppendText(path) 
     sw.WriteLine(oneLine) 
    End Using 
Loop 
sr.Close() 
+3

如果您註釋掉'Console.WriteLine(ONELINE)'行你可能會發現它運行速度快得多。 –

+1

見http://stackoverflow.com/questions/2161895/reading-large-text-files-with-streams-in-c-sharp,你可能就無法進行了許多改進過去所@AndrewMorton sugested – djv

回答

3

除了在評論中,你打開和關閉你正在寫的每一行輸出文件中提到的Console.WriteLine你的幫助。如果你只是打開該文件一次,它應該會快很多:

Dim sr As New StreamReader("C:\temp\300MB-File.txt") 
Dim path As String = "C:\temp\myFileNew2.txt" 
Dim oneLine As String 
oneLine = sr.ReadLine 

Using sw As StreamWriter = File.CreateText(path) 
    sw.WriteLine(oneLine) 
    Do Until sr.EndOfStream 
     'Console.WriteLine(oneLine) 
     oneLine = sr.ReadLine() 
     sw.WriteLine(oneLine) 
    Loop 
End Using 

sr.Close() 

你也可以使用File.ReadLines簡化代碼:

Dim inPath As String = "C:\temp\300MB-File.txt" 
Dim outPath As String = "C:\temp\myFileNew2.txt" 

Using sw As StreamWriter = File.CreateText(outPath) 
    For Each oneLine As String In File.ReadLines(inPath) 
     ' modify line here 
     sw.WriteLine(oneLine) 
    Next 
End Using 
+0

謝謝你非常「馬克」 你的「File.ReadLines」的建議很好。 在這裏的「修改行 我已經加入: 如果line.Contains(‘’),然後 您的意見,請! 這節省了整個流回到變量的「超高速」 再次感謝! – RDM

+0

@RDM是的,只需在'sw.WriteLine'調用之前更新'oneLine'變量,使用任何條件邏輯對您的用例都有意義。您可能還需要考慮用於讀寫的編碼 - 「CreateText」和「ReadLines」的默認值爲UTF-8。 – Mark

+0

再次感謝你馬克。這對我非常有幫助和學習經驗。 ---我想借此機會問你另一個問題,如果你不介意的話.-----單線變量的值,我想把它放在「For Each」塊之外。我喜歡在這個標籤下面做一些工作,並且不知道如何在ForEach Block之外跳轉變量的值。 – RDM