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 :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.
Partager