Lecture/écriture de fichier code trop lent
Bonjour à tous,
Suite à mon message sur le traitement d'un fichier xml en vba ici que j'ai résolu, JP m'a conseillé de poster un nouveau message pour voir si il y aurait moyen d'améliorer mon code pour qui actuellement très lent.
Donc voilà en gros je dois parcourir un fichier texte pour rechercher des caractères spécifiques et les remplacer par d'autres.
Pour cela j'ai décidé d'tuliser les FSO pour ouvrir le fichier texte, lire une ligne, la modifiée le cas échéant et l'écrire dans un nouveau fichier texte. Je n'ai pas trouver de solution pour modifier à la volée un fichier, je suis obligé d'en créer un nouveau et de copier le premier dedans. Pour la lecture tout ce passe bien mais l'écriture par les FSO était très lente, je suis donc passer avec les fonctions directe ce qui m'a fait gagner un peu de temps d'éxécution.
Voici mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| Function XMLFilePreTreatment(ByVal InputFileName As String) As String
Dim i As Long
Dim Text As String
Dim intFic As Integer
Dim oFSO As Scripting.FileSystemObject
Dim oTxtIn As Scripting.TextStream
'Instanciation du FSO
Set oFSO = New Scripting.FileSystemObject
intFic = FreeFile
XMLFilePreTreatment = (Split(InputFileName, ".")(0) & "_Corrected." & Split(InputFileName, ".")(1))
'Ouverture des fichiers
Set oTxtIn = oFSO.OpenTextFile(InputFileName, ForReading)
Open XMLFilePreTreatment For Output As intFic
'Traitement du fichier
With oTxtIn
Do While Not .AtEndOfStream
Text = .ReadLine 'Lecture de la ligne
Text = Replace(Text, "&#", "##") 'Modification le cas échéant
Print #intFic, Text 'Ecriture dans un nouveau fichier
Loop
End With
oTxtIn.Close
Close intFic
End Function |
A noter que ce code est long a éxécuter car les fichiers texte que je traite sont assez important, par exemple cela a pris 12 min sur un fichier 18,5Mo, 251 700 lignes et 18 906 486 caractères. Et ce fichier est plus petit que le standard. En standard je suis plutôt de l'ordre de 70Mo, 1 731 512 lignes ou encore 70 923 984 caratères.
Donc voilà mon code est quand même très simple mais peut être y a-t-il encore un moyen de l'optimiser pour réduire le temps d'éxécution. Si vous avez des idées :).