2011-06-04 1 views
2

J'ai de gros fichiers csv (1,5 Go chacun) où j'ai besoin de remplacer des valeurs spécifiques. La méthode que j'utilise actuellement est terriblement lente et je suis assez certain qu'il devrait y avoir un moyen d'accélérer cela, mais je n'ai pas assez d'expérience pour savoir ce que je devrais faire. C'est mon premier article et j'ai essayé de chercher quelque chose de pertinent mais je n'ai rien trouvé. Toute aide serait appréciée. Mon autre idée serait de décomposer le fichier en morceaux pour que je puisse tout lire en mémoire, y faire tous les remplacements, puis les sortir dans un fichier consolidé. J'ai essayé cela mais la façon dont je l'ai fait a finalement semblé plus lente que ma méthode actuelle.VB.Net Remplacement de valeurs spécifiques dans un fichier de texte volumineux

Merci!

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

Dans .Net 4, vous pouvez essayer [mémoire mappée fichiers] (http://stackoverflow.com/questions/2333075/net-4-0-memory-mapped-files-performance). Cela peut considérablement améliorer les performances des opérations de fichiers – MarkJ

Répondre

2

Vous êtes en train de diviser et de combiner, ce qui peut prendre du temps. Pourquoi ne pas simplement lire la ligne de texte?

Remplacez ensuite les occurrences de "5MM +" et "1MM +" par la valeur apprise, puis écrivez la ligne.

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

Ce serait plus rapide, du moment qu'il est possible de remplacer "5MM +" et "1MM +" dans plus que la dixième colonne. – N0Alias

+0

@DaMartyr: "dixième colonne" - hein? –

+0

Merci! Plus vite. – rwdvc

Questions connexes