fifiz | Bonjour,
Dans un cadre professionnel j'ai régulièrement besoin d'identifier les différences de paramétrage d'un progiciel travaillant sur une base de donnée sybase entre une base recette et une base préprod ou prod.
Les paramétrages sont extraits via des utilitaires dans des fichiers textes au format ascii.
Ces fichiers "ascii" sont convertis en "text" par un utilitaire sous unix
J'ai ensuite commencé a traivailler sur une macro permettant de lister les fichiers d'un répertoire (recette) puis de comparer chaque fichier au fichier equivalent de l'autre répertoire (production) pour enfin réécrire les lignes en différence dans chacun des répertoires.
Ca marche bien mais c'est lent, ca traite un mégaoctet de donnée a la minutes alors que sur des gros sites client on peut avoir plusieurs centaines de Mo de texte à comparer. SI ca prends une journée c'est pas top.
Pour rentrer dans le détails :
Une fois que mes fichiers sont chargés dans un tableau en mémoire, pour chaque ligne du premier tableau je balaye toutes les lignes du second tableau pour la rechercher, si je la trouve je les flag toutes les deux comme étant rapprochées sinon je la print dans un fichier.
Apres je balaye toutes les lignes non flagées du second tableau et je les print dans un autre fichier.
Je pense que cette partie pourrait être optimisée mais au vu de mes connaissances en vb je ne voie pas comment (déja pour l'utilisation des tableau j'ai beaucoup tatonné ...) Si on pouvait acceder au tableau via une sorte d'index pour retrouver dirrectement la ligne recherche ce serait royal est ce possible ?
Merci d'avance pour tous conseil relatif a l'optimisation de ce petit bout de code.
A+
Code :
- Option Explicit
- '----------------------------------------
- '----- Déclarations propres au module --
- '----------------------------------------
- ' --- Les variables ---
- Dim Typerecherche As String
- Dim PathOrigine As String
- Dim PathDestination As String
- Dim ToLoadMask As String
- Dim ToDeleteMask As String
- Dim FileMask As String
- Dim FileSourceOrigine As String
- Dim FileSourceDestination As String
- Dim FileResultatOrigine As String
- Dim FileResultatDestination As String
- Dim ContenuResultatOrigine As String
- Dim ContenuResultatDestination As String
- Dim MaxLigneOrigine As Long
- Dim MaxLigneDestination As Long
- Dim TotalLigne As Long
- Dim NombreOccurence As Long
- Dim NombreOccurenceTotal As Long
- Dim NombreOccurenceErreur As Long
- Dim MaxRecherche As Long
- Dim Chaine As String
- Dim Path As String
- Dim File As String
- Dim Flag As Boolean
- Global ListeLigneOrigine As ListeLigne
- Global ListeLigneDestination As ListeLigne
- Type ListeLigne
- Ligne() As String
- Flag() As String
- Nombre As Long
- End Type
- Public Sub Lister()
- ' --- Initialisation des variables ---
- NombreOccurence = 0
- NombreOccurenceTotal = 0
- NombreOccurenceErreur = 0
- ResultatRecherche.Nombre = 0
-
- ' --- Lecture des paramètres de la recherche ---
- PathOrigine = Range("Path_origine" ).Value
- PathDestination = Range("Path_destination" ).Value
- FileMask = Range("File_mask" ).Value
- ToLoadMask = Range("To_load_mask" ).Value
- ToDeleteMask = Range("To_Delete_mask" ).Value
-
- ' --- Constitution du tableau ---
- BarRecherche.LabelProgress.Width = 0
- BarRecherche.Show
- End Sub
- Public Sub Progression()
- With BarRecherche
- .FrameProgress.Caption = Format(a / TotalLigne, "0%" )
- .LabelProgress.Width = a / TotalLigne * (.FrameProgress.Width - 10)
- End With
- DoEvents
- If Range("Abort" ) = True Then
- Unload BarRecherche
- Exit Sub
- End If
- End Sub
- Public Sub Bar_Lister()
- ' --- Déclaration des variables ---
- Dim r As Long
- Dim l As Long
- Dim o As Long
- Dim d As Long
- Dim a As Long
- Dim fs, FD, FO
- ' initialisation des variables
- TotalLigne = 0
- a = 0
- ' --- Recherche de tous les fichiers ---
- Set fs = CreateObject("Scripting.FileSystemObject" )
- NombreOccurence = Rechercher(PathOrigine, "*" + FileMask, ResultatRecherche)
-
- ' --- Premiere passe pour estimer le temps de traitement ---
- For r = 1 To ResultatRecherche.Nombre
- FileSourceOrigine = Trim(ResultatRecherche.Chemin(r)) & Trim(ResultatRecherche.Fichiers(r).cFileName)
- Open FileSourceOrigine For Input Access Read As #1
- While (Not EOF(1))
- Line Input #1, Chaine
- If Chaine <> "" Then
- TotalLigne = TotalLigne + 1
- End If
- Wend
- Close #1
- FileSourceDestination = ReplaceString(Trim(ResultatRecherche.Chemin(r)), PathOrigine, _
- PathDestination) & Trim(ResultatRecherche.Fichiers(r).cFileName)
- Open FileSourceDestination For Input Access Read As #1
- While (Not EOF(1))
- Line Input #1, Chaine
- If Chaine <> "" Then
- TotalLigne = TotalLigne + 1
- End If
- Wend
- Close #1
- Next r
-
- ' --- 2eme passe pour effectuer le traitement
- For r = 1 To ResultatRecherche.Nombre
- ' Réinitialisation des variables
- ListeLigneOrigine.Nombre = 0
- ListeLigneDestination.Nombre = 0
-
- ' Lectures des fichiers
- FileSourceOrigine = Trim(ResultatRecherche.Chemin(r)) & Trim(ResultatRecherche.Fichiers(r).cFileName)
- Open FileSourceOrigine For Input Access Read As #1
- While (Not EOF(1))
- Line Input #1, Chaine
- If Chaine <> "" Then
- ListeLigneOrigine.Nombre = ListeLigneOrigine.Nombre + 1
- ReDim Preserve ListeLigneOrigine.Ligne(1 To ListeLigneOrigine.Nombre)
- ReDim Preserve ListeLigneOrigine.Flag(1 To ListeLigneOrigine.Nombre)
- ListeLigneOrigine.Ligne(ListeLigneOrigine.Nombre) = Chaine
- ListeLigneOrigine.Flag(ListeLigneOrigine.Nombre) = ""
- MaxLigneOrigine = ListeLigneOrigine.Nombre
- End If
- Wend
- Close #1
- FileSourceDestination = ReplaceString(Trim(ResultatRecherche.Chemin(r)), PathOrigine, _
- PathDestination) & Trim(ResultatRecherche.Fichiers(r).cFileName)
- Open FileSourceDestination For Input Access Read As #1
- While (Not EOF(1))
- Line Input #1, Chaine
- If Chaine <> "" Then
- ListeLigneDestination.Nombre = ListeLigneDestination.Nombre + 1
- ReDim Preserve ListeLigneDestination.Ligne(1 To ListeLigneDestination.Nombre)
- ReDim Preserve ListeLigneDestination.Flag(1 To ListeLigneDestination.Nombre)
- ListeLigneDestination.Ligne(ListeLigneDestination.Nombre) = Chaine
- ListeLigneDestination.Flag(ListeLigneDestination.Nombre) = ""
- MaxLigneDestination = ListeLigneDestination.Nombre
- End If
- Wend
- Close #1
- ' Identification des différences & écritures des fichiers
- FileResultatOrigine = ReplaceString(FileSourceOrigine, FileMask, ToLoadMask)
- Set FO = fs.CreateTextFile(FileResultatOrigine)
- For o = 1 To MaxLigneOrigine
- Flag = False
- For d = 1 To MaxLigneDestination
- If ListeLigneDestination.Flag(d) <> "Y" And ListeLigneOrigine.Flag(o) <> "Y" Then
- If ListeLigneOrigine.Ligne(o) = ListeLigneDestination.Ligne(d) Then
- ListeLigneOrigine.Flag(o) = "Y"
- ListeLigneDestination.Flag(d) = "Y"
- a = a + 2
- Flag = True
- End If
- End If
- Next d
- If Flag = False Then
- FO.writeline (ListeLigneOrigine.Ligne(o))
- ListeLigneOrigine.Flag(o) = "N"
- a = a + 1
- End If
- Call Progression
- Next o
- FileResultatDestination = ReplaceString(FileSourceDestination, FileMask, ToDeleteMask)
- Set FD = fs.CreateTextFile(FileResultatDestination)
- For d = 1 To MaxLigneDestination
- If ListeLigneDestination.Flag(d) = "" Then
- FD.writeline (ListeLigneDestination.Ligne(d))
- a = a + 1
- End If
- Call Progression
- Next d
- Next r
-
- Unload BarRecherche
- End sub
|
PS : la fonction rechercher (x,y,z) permet de lister tous les fichiers d'un répertoire et de ses sous répertoires ayant une extention donné dans un tableau "Liste.recherche" mais comme c'est pas la partie qui me pose problème ...
|