2011-06-04 74 views
2

我有一些較大的csv文件(每個1.5gb),我需要替換特定值。我目前使用的方法非常慢,我相當肯定應該有一種方法來加速這一點,但我只是沒有足夠的經驗知道我應該做什麼。這是我的第一篇文章,我試圖找到相關的東西,但沒有遇到任何東西。任何幫助,將不勝感激。VB.Net替換大文本文件中的特定值

我的另一個想法是將文件分解成塊,以便我可以將整個內容讀入內存,執行所有替換,然後輸出到合併文件。我試過這個,但是我做到這一點的方式實際上最終看起來比我目前的方法慢。

謝謝!

Sub Main() 
    Dim fName As String = "2009.csv" 
    Dim wrtFile As String = "2009.1.csv" 
    Dim lRead 
    Dim lwrite As String 
    Dim strRead As New System.IO.StreamReader(fName) 
    Dim strWrite As New System.IO.StreamWriter(wrtFile) 
    Dim bulkWrite As String 

    bulkWrite = "" 
    Do While strRead.Peek <> -1 
     lRead = Split(strRead.ReadLine(), ",") 
     If lRead(9) = "5MM+" Then lRead(9) = "5000000" 
     If lRead(9) = "1MM+" Then lRead(9) = "1000000" 

     lwrite = "" 
     For i = LBound(lRead) To UBound(lRead) 
      lwrite = lwrite & lRead(i) & "," 
     Next 
     strWrite.WriteLine(lwrite) 
    Loop 

    strRead.Close() 
    strWrite.Close() 
End Sub 
+0

在.Net 4中,您可以嘗試[內存映射文件](http://stackoverflow.com/questions/2333075/net-4-0-memory-mapped-files-performance)。這可以顯着提升文件操作的性能 – MarkJ 2011-06-05 21:28:43

回答

2

您正在拆分和合並,這可能需要一些時間。

爲什麼不只是閱讀文本行。然後用適當的值替換「5MM +」和「1MM +」的任何出現,然後寫下該行。

Do While ... 
    s = strRead.ReadLine(); 
    s = s.Replace("5MM+", "5000000") 
    s = s.Replace("1MM+", "1000000") 
    strWrite(s); 
Loop 
+0

只要在第十列以上替換「5MM +」和「1MM +」就可以更快。 – N0Alias 2011-06-04 01:53:03

+0

@DaMartyr:「第十列」 - 嗯? – 2011-06-04 01:55:35

+0

謝謝!快多了。 – rwdvc 2011-06-04 01:57:09