Comparaison du contenu de deux fichiers texte

Bonjour à tous,

J'aimerais comparer le contenu du fichier texte 1txt avec celui de 2.txt et faire ressortir le résultat dans un troisième fichier 3.txt.

Ce dernier devra contenir les résultats suivants avec numéros des lignes concernées :

1) Lignes modifiées

2) Lignes supprimées

3) Lignes ajoutées

Merci d'avance.

471.txt (1.26 Ko)
442.txt (1.20 Ko)
533.txt (970.00 Octets)

Bonjour,

Voila un essai en PJ.

Mais, j'ai une erreur sur cette ligne :

    ' Ouvrir les fichier texte dans excel
    Workbooks.OpenText Filename:= _
                       "\1.txt", Origin:=xlMSDOS, _
                       StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(18 _
                     , 1), Array(38, 1), Array(45, 1), Array(52, 1), Array(61, 1), Array(66, 1), Array(73, 1)), _
                                                                                                TrailingMinusNumbers:=True

Bonjour à tous,

Voila, j'ai un peu avancé dans le code, mais le résultat souhaité est loin d'être obtenu :

Sub CompareFileTxt()
    Const Delimiter = " "
    Dim FName1$, FName2$
    Dim fso As Object   'FileSystemObject
    Dim TS As Object    'TextStream
    Dim Lines(0 To 1)
    Dim Word(0 To 1)
    Dim VarCol(5) As Boolean
    Dim Tbl1(), Tbl2(), Lm(), La(), Ls()

    Dim LineNr As Long, Lastrow As Integer
    Dim i As Integer, j As Integer, k As Integer, m As Integer, a As Integer, s As Integer
    Dim Result As String, T$

    FName1 = ThisWorkbook.Path & "\1.txt"
    FName2 = ThisWorkbook.Path & "\2.txt"
    ReDim Lm(1): ReDim La(1): ReDim Ls(1)
    Lm(0) = "Lignes modifiées :": m = 0
    La(0) = "Lignes ajoutées :": a = 0
    Ls(0) = "Lignes supprimées :": s = 0
    'Lecture contenu
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set TS = fso.OpenTextFile(FName1)
    Lines(0) = Split(TS.ReadAll, vbCrLf)
    TS.Close
    Set TS = fso.OpenTextFile(FName2)
    Lines(1) = Split(TS.ReadAll, vbCrLf)
    TS.Close

    Workbooks.OpenText Filename:= _
                       FName1, Origin:=xlMSDOS, _
                       StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(24 _
                                                                                                , 1), Array(36, 1), Array(46, 1), Array(56, 1), Array(65, 1), Array(70, 1)), _
                                                                                                TrailingMinusNumbers:=True

    'Effacer tous les en-têtes inutils avant la ligne contenant le mot "MCELL"
    Lastrow = Cells.Find(What:="MCELL", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    Rows("1:" & Lastrow).Delete Shift:=xlUp

    'Effacer les dernieres lignes à partir de la ligne contenant le mot "END"
    Lastrow = Cells.Find(What:="END", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    Rows(Lastrow & ":" & Lastrow).Delete Shift:=xlUp
    Lastrow = [A65000].End(xlUp).Row
    '    MsgBox "Adresse : " & Range("A1:G" & Lastrow).Address
    Tbl1 = Range("A1:G" & Lastrow).Value

    '~~~~~~~~~~~~~~~
    ' Ouvrir les fichier texte dans excel
    Workbooks.OpenText Filename:= _
                       FName2, Origin:=xlMSDOS, _
                       StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(24 _
                                                                                                , 1), Array(36, 1), Array(46, 1), Array(56, 1), Array(65, 1), Array(70, 1)), _
                                                                                                TrailingMinusNumbers:=True

    'Effacer tous les en-têtes inutils avant la ligne contenant le mot "MCELL"
    Lastrow = Cells.Find(What:="MCELL", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    Rows("1:" & Lastrow - 1).Delete Shift:=xlUp

    'Effacer les dernieres lignes à partie du la ligne contenant le mot "END"
    Lastrow = Cells.Find(What:="END", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    Rows(Lastrow & ":" & Lastrow).Delete Shift:=xlUp

    Lastrow = [A65000].End(xlUp).Row
    'MsgBox "Adresse : " & Range("A1:G" & Lastrow).Address
    Tbl2 = Range("A1:G" & Lastrow).Value

    For i = 1 To WorksheetFunction.Min(UBound(Tbl1), UBound(Tbl2))
        T = ""
        For j = 1 To UBound(Tbl1, 2)
            If Tbl1(i, j) = Tbl2(i, j) Then
                For k = 2 To 7
                    'Modification
                    If Tbl1(i, k) <> Tbl2(i, k) Then
                        T = T & k & "|"
                        'enregistrer les lignes modifiées
                        m = m + 2
                        ReDim Preserve Lm(m)
                        Lm(m - 1) = i & ". Modification de " & Tbl1(i, k) & " vers " & Tbl2(i, k)
                        Lm(m) = Lines(0)(i)
                    End If

                Next k
                Exit For
            ElseIf j = 7 Then
                'Suppression

                '                MsgBox "Cette ligne : " & vbCrLf & _
                                 '                       Lines(0)(i) & vbCrLf & _
                                 '                       "a été supprimée du deuxième fichier"
                s = s + 2
                ReDim Preserve Ls(s)

                Ls(s - 1) = i & ". Suppression de la ligne : "
                Ls(s) = Lines(0)(i)

            End If
        Next j
        If Len(T) > 0 Then
            MsgBox "T :" & T
            m = m + 1
            ReDim Preserve Lm(m)
            Lm(m) = Lines(1)(i)
        End If
    Next i
    ' Fichier résulat 3.txt
    Result = "3"
    Open Result For Output As #1
    ' Ecrire les lignes modifiées
    For LineNr = 0 To UBound(Lm)
        Print #1, Lm(LineNr)
    Next LineNr
    ' Ecrire les lignes supprimées
    For LineNr = 0 To UBound(Ls)
        Print #1, Ls(LineNr)
    Next LineNr
    ' Ecrire les lignes ajoutées
    For LineNr = 0 To UBound(La)
        Print #1, La(LineNr)
    Next LineNr
    Close #1
End Sub

Bon, ce que j'ai fait, c'est d'ouvrir les fichiers 1.txt et 2.txt dans Excel pour obtenir des données en 7 colonnes pour que je puisse les sauvegarder dans des tableaux pour accélérer le traitement.

Alors Tbl1 sert pour le fichier 1.txt et Tbl2 servira pour le fichier 2.txt.

Je commence à comparer chaque ligne du Tbl1 avec toutes celles des Tbl2.

Comme les valeurs de la première colonne ne se répètent pas dans un même fichier texte, dans la boucle une fois une valeur est trouvée dans les deux tableaux, on sort de cette dernière.

Avant de sortir, on devra comparer dans les colonnes restantes des deux lignes en cours dans les deux tableaux pour connaitre ce qui a été modifié ou enlever.

Le tableau Lm (Lignes modifiées) est fait pour enregistrer ces modifications ou suppressions depuis les colonnes 2 à 7 pour une valeur donnée dans la première colonne.

Le tableau Ls (Lignes supprimées) servira pour enregistrer les lignes supprimées dans le deuxième fichier 2.txt

Celui de La (Lignes ajoutées) (pas encore traité) servira pour enregistrer les lignes qui se trouveront dans 2.txt et sont absents dans 1.txt

Enfin du traitement, le tous est écrit dans le fichier 3.txt.

Voila.

Merci.

Bonjour à tous,

Le résultat obtenu jusqu'à maintenant n'est pas celui voulu.

Par exemple j'aimerais avoir ce résultat pour la ligne 10 :

10. Modification du paramètre "OT-98" vers "OT-1"

33[2]-0231 OT=1 TT=98

Q=7(1)

10. Suppression du paramètre "N=9"

33[2]-0231 OT=1 TT=98

Q=7(1)

Mais avec la V3 en PJ Je n'obtiens que ceci pour la ligne 10 :

10. Suppression de la ligne :

Q=7(1)

Or ce "Q=7(1)" est un paramètre de la ligne 10 et il ne doit pas être traité comme étant une ligne indépendante

J'espère avoir un peu éclairter les choses !

Merci.

233.txt (1.77 Ko)
Rechercher des sujets similaires à "comparaison contenu deux fichiers texte"