Suppression de lignes dans un fichier .xml

heparti

XLDnaute Occasionnel
Bonjour,

Je dois traiter des fichiers .xml qui font plusieurs milliers de lignes.

Ce traitement consiste en la suppression de plusieurs centaines de lignes se trouvant entre deux balises (par exemple : <NOM>....</NOM>).

J'ai dans un fichier excel la liste des données qui me permettent de recherches ces ensembles de lignes.

Actuellement, je recherche la référence qui m'intéresse avec notepad++ en faisant CTRL+F, puis une fois trouvé je remonte jusqu'à la base de début <NOM>, je clique sur le '-' pour regrouper toutes les lignes et je supprime ce groupe de lignes, ainsi de suite.

Je souhaite donc automatiser ces suppressions en prenant la base des données à supprimer dans un fichier excel et que ça recherche automatiquement dans le fichier .xml puis suppression automatique des environ 120 lignes dans le fichier .xml.

Je passe environ 2 jours pour supprimer les 1700-2000 groupes de lignes manuellement, incluant le risque d'erreurs de manipulation. Même si la solution à ce problème prend une demi journée, ce n'est pas un problème :D

Merci.
 

tototiti2008

XLDnaute Barbatruc
Re : Suppression de lignes dans un fichier .xml

Bonjour heparti,

Peut-être, si tu lances bien la macro avec la liste des familles a exclure en colonne A de la feuille active

Code:
Dim Lignes() As String, LignesCond() As String
Sub NettXML()
Dim FamMAT, AdrXML As String, AdrXMLTrait As String
Dim BoolIFROC As Boolean, BoolMAT As Boolean, BoolCons As Boolean
Dim LigXML As String, i As Long
Dim fs, f1, f2
    ReDim Lignes(1 To 1) 'Tableau des lignes XML à conserver
    ReDim LignesCond(1 To 1) 'Tableau des lignes XML à conserver sous condition
    FamMAT = Range("A1:A" & Range("A65536").End(xlUp).Row) 'Tableau des familles pour lesquelles le XML est supprimé
    AdrXML = "C:\temp\essai.xml" 'Adresse du fichier à traiter
    AdrXMLTrait = "C:\temp\essai2.xml" 'Adresse du fichier traité
    BoolIFROC = False
    BoolMAT = False
    BoolCons = False
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f1 = fs.OpenTextFile(AdrXML, 1, False, -2)
    Do Until f1.AtEndOfStream
        LigXML = f1.ReadLine
        If UCase(LigXML) = "<IFROC>" Then BoolIFROC = True
        If UCase(LigXML) = "</IFROC>" Then BoolIFROC = False
        If UCase(LigXML) Like "<MAT>*</MAT>" Then BoolMAT = True
        If Not BoolIFROC And Not BoolMAT Then
            If BoolCons Then
                Call AjoutCond
                If Lignes(1) <> "" Then ReDim Preserve Lignes(1 To UBound(Lignes) + 1)
                Lignes(UBound(Lignes)) = LigXML
            End If
            ReDim LignesCond(1 To 1)
            BoolCons = False
        ElseIf BoolIFROC And Not BoolMAT Then
            If LignesCond(1) <> "" Then ReDim Preserve LignesCond(1 To UBound(LignesCond) + 1)
            LignesCond(UBound(LignesCond)) = LigXML
        ElseIf BoolIFROC And BoolMAT Then
            If TabloExist(FamMAT, LigXML) Then
                BoolCons = False
            Else
                If LignesCond(1) <> "" Then ReDim Preserve LignesCond(1 To UBound(LignesCond) + 1)
                LignesCond(UBound(LignesCond)) = LigXML
                BoolCons = True
            End If
            BoolMAT = False
        End If
    Loop
    f1.Close
    Set f2 = fs.CreateTextFile(AdrXMLTrait, True)
    For i = LBound(Lignes) To UBound(Lignes)
        f2.WriteLine Lignes(i)
    Next i
    f2.Close
    Set f1 = Nothing
    Set f2 = Nothing
    Set fs = Nothing
End Sub
Sub AjoutCond()
Dim i As Long
    For i = LBound(LignesCond) To UBound(LignesCond)
        If Lignes(1) <> "" Then ReDim Preserve Lignes(1 To UBound(Lignes) + 1)
        Lignes(UBound(Lignes)) = LignesCond(i)
    Next i
End Sub
Function TabloExist(Tablo, Valo) As Boolean
Dim i As Long
    For i = LBound(Tablo) To UBound(Tablo)
        If Valo Like "*" & Tablo(i, 1) & "*" Then
            TabloExist = True
            Exit For
        End If
    Next i
End Function
 

heparti

XLDnaute Occasionnel
Re : Suppression de lignes dans un fichier .xml

Merci pour ce nouveau code qui fonctionne très bien sur tes fichiers d'exemple mais que je n'arrive pas, pour le moment, à transposer sur mes fichiers de test (basés sur les fichiers réels).

Je n'arrive pas à substituer les valeurs des balises (IFROC, MAT,...) par les balises réelles, ce qui fait que le fichier .xml généré est vide.

Je vais persister et j'espère y arriver d'ici à demain ;) ;)

Sinon, dans ton code, les valeurs 'BoolIFROC' et autres sont elles à substituer par les valeurs 'BoolVRAIEVALEUR' ?
 

heparti

XLDnaute Occasionnel
Re : Suppression de lignes dans un fichier .xml

De plus, si je souhaite changer de valeur de référence qui est pour le moment ce qui est entre les balises <MAT> et </MAT>.

Par exemple, en prenant la donnée figurant entre les balises <DemandeROC> et </DemandeROC> (qui sont sur la même ligne dans le fichier .xml

Cette modification peut également être liée à une modification de la structure du fichier .xml qui oblige soit à changer de balise ou d'emplacement de balise car celle-ci sera plus haute ou plus basse dans la structure de la famille.

Je viens de tester en prenant les balises <DemandeROC> et </DemandeROC> et aucune famille n'est supprimée dans le fichier .xml généré par la macro.

Merci en tout cas pour ton aide qui me permet de voir quasiment le bout du tunnel :D :D
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : Suppression de lignes dans un fichier .xml

Bonjour heparti,

Merci en tout cas pour ton aide qui me permet de voir quasiment le bout du tunnel :D :D

Je vois que l'optimisme est de rigueur, mais si ta problématique évolue encore beaucoup au fur et à mesure de l'avance du fil, je ne sais pas si on en verra le bout :rolleyes:

BoolIFROC et BoolMAT sont des noms de variables, pas obligé de les modifier pour que ça fonctionne
Ce sont des booléens (VRAI ou FAUX) permettant de savoir si on est (ou pas) entre 2 balises IFROC ou entre 2 balises MAT
En fonction de leur valeur, je fais les tests pour déterminer si la section IFROC est à conserver ou à supprimer
L'emplacement de la balise n'a pas d'importance, chaque ligne du fichier est lue

Je viens de tester en prenant les balises <DemandeROC> et </DemandeROC> et aucune famille n'est supprimée dans le fichier .xml généré par la macro.

Et comment as-tu modifié le code pour gérer ce cas ?
 

heparti

XLDnaute Occasionnel
Re : Suppression de lignes dans un fichier .xml

Je reviens après quelques jours de congé ;)

J'ai effectué quelques tests grandeur nature et cela semble fonctionner parfaitement même si je dois recopier dans le fichier généré le début et la fin du fichier xml d'origine (se trouvant avant la première balise <IFROC> et après la dernière balise </IFROC>.

Ce n'est qu'un détail en comparaison du temps gagné grace à la macro :D :D

Je vais l'appliquer en production cette semaine et si un soucis intervient, je le ferais remonter.

Encore merci pour ton aide extrêmement précieuse ;)
 

tototiti2008

XLDnaute Barbatruc
Re : Suppression de lignes dans un fichier .xml

Bonsoir heparti

même si je dois recopier dans le fichier généré le début et la fin du fichier xml d'origine

Oups, j'en déduis que ma macro l'efface, désolé
C'est toujours le risque entre un fichier exemple et les vrais fichiers utilisés

Je vais l'appliquer en production cette semaine et si un soucis intervient, je le ferais remonter

"Le code proposé est à utiliser à vos propres risques et tototiti2008 ne peut en aucun cas être trainé en justice pour tout disfonctionnement du code proposé en production" ;)
 

heparti

XLDnaute Occasionnel
Re : Suppression de lignes dans un fichier .xml

Aucun problème ;)

Pour la seconde partie, je le ferais en 2 étapes, à savoir une phase de test avec vérification par des tests aléatoires dans la structure des fichiers, et si c'est correct, utilisation des fichiers générés en production après une nouvelle vérification de la structure des fichiers.:D:p
 

Discussions similaires

Statistiques des forums

Discussions
312 677
Messages
2 090 815
Membres
104 673
dernier inscrit
lautard