Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Nouveau Candidat au Club
    Améliorer la performance d'écriture dans un fichier UTF-8
    Bonjour à tous,

    Je suis actuellement en train de travailler sur un VBS pour concaténer plusieurs fichiers csv en un unique fichier.

    Les points d'attention sont les suivants :
    - Il y a 6 fichiers UTF-8 à concaténer et chaque fichier fait environ 70 000 lignes
    - Les 20 premières lignes de chaque fichier sont à ignorer sauf pour le premier car la 20ème contient les entêtes de ligne

    Mon problème actuellement est la performance du code utilisé. Il fonctionne correctement mais prend plus d'une heure pour traiter les 20 000 premières lignes et le temps de traitement par ligne augmente au fur et à mesure. Ce code devant tourner tous les jours, un temps de traitement supérieur à 24h n'est évidemment pas acceptable.

    Après plusieurs tests, la partie qui pose problème est l'écriture des fichiers (leur lecture ne prend que quelques minutes).

    Le code pour écrire dans mon nouveau fichier cible est le suivant :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Sub ECRIRE_FICHIER(MON_FICHIER_TGT, ByRef MON_FICHIER_LU, FILE_TYPE_NAME, DELIMETER)
    	Dim FileText
    	Dim i,j, BufferLine
     
    	Select Case FILE_TYPE_NAME
    		Case "UTF-8"	
    			BufferLine = ""
    			For i=0 to Ubound(MON_FICHIER_LU)-2
    				end if
    				BufferLine = BufferLine & MON_FICHIER_LU(i)(0)
    				For j=0 to UBound(MON_FICHIER_LU(i))
    					BufferLine = BufferLine & DELIMETER & MON_FICHIER_LU(i)(j)
    				Next
    				BufferLine = BufferLine & vbCrLf
    			Next
    			Set FileText = CreateObject("ADODB.Stream")
    				With FileText		
    					.CharSet = "utf-8"
    					.Mode = 3			
    					.Open
    					.Type = 2
    					.Position = 0			
    					.WriteText(BufferLine)
    				End With
    			FileText.SaveToFile(MON_FICHIER_TGT)
    			Set FileText = Nothing
    		Case "ANSI"
    			Set FileText = CreateObject("Scripting.FileSystemObject").OpenTextFile(MON_FICHIER_TGT,2,True,0)
    			For i=0 to Ubound(MON_FICHIER_LU)
    				BufferLine = BufferLine & MON_FICHIER_LU(i)(0)
    				For j=0 to UBound(MON_FICHIER_LU(i))
    					BufferLine = BufferLine & DELIMETER & MON_FICHIER_LU(i)(j)
    				Next
    				FileText.WriteLine(BufferLine)
    				BufferLine = ""
    			Next		
    			FileText.Close
    			Set FileText = Nothing			
    	End Select
    End Sub


    Si quelqu'un a une idée pour optimiser la partie UTF-8, cela me sera d'une grande aide !

    Wombowser

  2. #2
    Rédacteur

    bonjour,

    essaye ceci à la place des lignes 6 à 26 de ton extrait :
    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
    Dim Concat()
    Case "UTF-8"
      ReDim Concat(UBound(MON_FICHIER_LU) - 2	
      For i = 0 to Ubound(MON_FICHIER_LU) - 2
        Concat(i) = MON_FICHIER_LU(i)(0) & DELIMITER & Join(MON_FICHIER_LU(i),DELIMITER)
      Next
      Set FileText = CreateObject("ADODB.Stream")
      With FileText		
        .CharSet = "utf-8"
        .Mode = 3			
        .Open
        .Type = 2
        .Position = 0			
        .WriteText(Join(Concat,vbCrLf),1)
      End With
      FileText.SaveToFile(MON_FICHIER_TGT)
      Set FileText = Nothing

    l'amélioration devrait être sensible
    si tu as besoin de précisions j'essaierais de te répondre mais en ce moment j'ai plage...
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  3. #3
    Nouveau Candidat au Club
    Bonjour Omen999,

    J'ai essayé en utilisant la fonction "Join" et l'amélioration de la performance est incroyable.

    Ce qui prenait 24h ne prend maintenant qu'une dizaine de minutes.

    Merci beaucoup et continue à profiter de la plage !

###raw>template_hook.ano_emploi###