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.
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 SubBon, 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.