Bonjour à tous,
je suis face a un problème délicat j'ai la solution a mon problème initial mais le temps d'exécution de mon script est tellement long que je ne peut pas me permettre de le concidérer comme terminer.
Problèmatique :
Je doit faire un traitement de deux fichiers de taille différente (premier fichier de 355Ko et le second de 6 115Ko) mais de structure identique. Le traitement a effectuer est de lire le fichier, trouver toute les lignes contenant les valeur comprise entre 40100001 et 40199999 et comprise entre 41100001 et 41199999 pour y ajouter à la fin selon le fichier traité une lettre V pour le petit fichier ou M pour le plus gros.
Hors il s'avére que le traitement du plus petit fichier met beaucoup plus de 30 minutes. Le petit fichier contient quand même plus de 86.000 lignes et le plus gros plus de 3.000.000 de lignes. Et je ne peut absolument pas supprimer les retours à la ligne.
Les fichiers :
Voici la structure des fichiers :
Code : Tout sélectionner
#FLG 000
#VER 14
#DEV EUR
#MECG
03
031110
211210
1
100001
4110000
51125000
41136557
WEINBRECK BERNARD
2
4118,69
0,000000
0,00
0
1
166,91
A
0
0
0
0
0
0
0
0,00
#MECG
Mes scripts :
La version 1 du script :
► Afficher le texte
Code : Tout sélectionner
#include <file.au3>
#include <string.au3>
;---------------------------
;Nom des fichiers à traiter
$fichierVDA = 'test.txt'
$fichierMARCQ = 'EXPMARCQ.txt'
;---------------------------
; Etape 1 traitement fichierVDA
$file = FileOpen($fichierVDA, 0)
$read = FileRead($file)
$line = StringSplit($read, @CR)
For $i = 1 To $line[0]
$var = FileReadLine($file, $i)
;MsgBox(1,"résultat Entree",$var)
$ctrl = StringIsXDigit($var)
if $var >= '40100001' And $var <= '40199999' And $ctrl == 1 Or $var >= "41100001" AND $var <= "41199999" And $ctrl == 1 Then
$sortie=StringRegExpReplace($var,$var,$var & "V")
Filewrite("IMPORT_VDA.txt", $sortie & @CRLF)
;MsgBox(1,"résultat sortie",$sortie)
Else
Filewrite("IMPORT_VDA.txt", $var & @CRLF)
Endif
Next
FileClose($fichierVDA)
Exit
Ou tout est géré en même temps il lit le fichier d'origine et réécrit dans un fichier de destination.
La version 2 du script :
► Afficher le texte
Code : Tout sélectionner
#include <file.au3>
#include <string.au3>
#include <Array.au3>
;---------------------------
;Nom des fichiers à traiter
$fichierVDA = 'test.txt'
$fichierMARCQ = 'EXPMARCQ.txt'
$dest = 'SAUVE'
;---------------------------
FileCopy($fichierVDA,$dest,1)
$fin = _FileCountLines($fichierVDA)
MsgBox(1,"","Nombre de ligne : "&$fin)
Dim $array[1]=["LIGNE"]
Dim $colonearray[1]=["COLONNE"]
$x=1
for $i = 1 to $fin
$var = FileReadLine($fichierVDA, $i)
$ctrl = StringIsXDigit($var)
if $var >= '40100001' And $var <= '40199999' And $ctrl == 1 Or $var >= "41100001" And $var <= "41199999" And $ctrl == 1 Then
;MsgBox(1,"array","valeur $x : " & $x)
ReDim $array[$x]
ReDim $colonearray[$x]
_ArrayInsert($array,$x,$i) ;ajout dans tableau du N° ligne a modifier
_ArrayInsert($colonearray,$x,$var) ;ajout dans tableau de la valeur a modifier
;MsgBox(1,"Traitement ","Traitement terminé à " &$array[0]&" seconde valeur "& $array[$x])
;MsgBox(1,"Traitement ","Traitement terminé à " &$colonearray[0]&" seconde valeur "& $colonearray[$x])
$x=$x+1
Msgbox(1,"ligne","Ligne traitée : "&$i,2)
EndIf
Next
MsgBox(1,"Fin recherche","le traitement de recherche des valeur a modifier est terminé"&@CRLF&"Lancement du traitement de modification")
For $modif = 1 to $array[0]
_FileWriteToLine($fichierVDA,$array[$modif],$colonearray[$modif] & "V",1)
next
$H= FileGetTime($fichierVDA,0,1)
MsgBox(1,"Traitement ","Traitement est terminé à " &$H)
Exit
Où la je travaille avec des array en espérent augmenter la vitesse mais ce n'ai pas mieux.
Comment puis je faire pour améliorer la vitesse d'exécution de ceci ? car si je met plus de 30 minutes pour le petit fichier je n'ose imaginer le temps pour le plus gros.
merci de votre aide.