Recherche et suppression dans un .xml

Klaas

XLDnaute Nouveau
Bonjour,

J'ai besoin d'aide.


Ma mission actuelle consiste à parcourir un fichier xml, pour retirer des informations qu'on considere pas importantes, pour analyser les infos importantes du fichier. Le fichier fait quelques 3 millions de lignes donc pour optimiser l'analyse, on veut retirer de l'info. L'info qu'on veut retirer est entre des balises, que l'on connait.Tout ca en macro VBA.

J'ai fait une macro qui parcours le fichier lettre par lettre et qui trouve la balise en question et qui supprime une selection.
Lettre par lettre le fichier met près d'une heure à tout traiter.

C'est pourquoi je voulais savoir s'il existait des méthodes pour trouver des balises (de l'ouverture à la fermeture) et de les selectionner et les supprimer dans un fichier xml à partir d'une macro VBA.


Auriez-vous une solution avec un code, car je suppose que c'est très rapide d'effectuer une recherche de balise connaisant sa position dans le xml (c a d le combientiemme noeuds c'est, à partir de quel noeud père, etc...) ?

Merci beaucoup
 

2passage

XLDnaute Impliqué
Re : Recherche et suppression dans un .xml

Bonjour,

Si la seule fonction est de supprimer du volume d'info, il faut mieux faire ça avec un éditeur de texte ou un parser XML. Un notepad++ ou ultraedit permet de faire un remplacer "<Balise>?</Balise>" par "".
Sinon, il sera peut-être plus rapide de charger le fichier ligne par ligne et de faire une recherche de la balise dans la chaine remontée ?
++
 

Klaas

XLDnaute Nouveau
Re : Recherche et suppression dans un .xml

Merci de ta réponse, mais j'ai oublié de préciser que les balises à supprimer sont présentes environ 1000 fois au minimum (elles se répentent mais avec des attributs différents à chaque fois).
Le but est de lancer le programme une fois. Faire cette recherche me semble assez long sachant que le but est de traiter plein de fichiers. Je voudrais automatiser le process.

Et ouvrir un fichier texte de 3 millions de ligne dans notepad++ fait vraiment ramer mon PC.
 

MJ13

XLDnaute Barbatruc
Re : Recherche et suppression dans un .xml

Bonjour Klass, 2Passage

Si le fichier XLM est un fichier texte, tu peux peut-être l'ouvrir avec Word et remplacer dans Word (mais pas sur que cela fonctionne).

Sinon comme l'as dit 2passage, si tu peux lire le fichier XLM comme un fichier texte, c'est assez rapide avec open #1, Fichier.xlm as input (ou un code de ce type que tu trouveras sans peine sur le net).

Après il faut vraiment savoir ce que tu veux supprimer exactement (en informatqiue, il faut une logique) car la, cela me paraît assez aléatoire
avec des attributs différents à chaque fois
.
 

Klaas

XLDnaute Nouveau
Re : Recherche et suppression dans un .xml

Oui j'ai fait un fichier qui traite l'XML comme un fichier texte, le voilà:

Sub modifXML()


Dim TempLettre As String
Dim TempMot As String
Dim TempMotDelete As String
TempMotDelete = "<optionSchedule>"
Dim TempMotDeleteFermeture As String
TempMotDeleteFermeture = "</optionSchedule>"
Dim TempSelectionDelete As String


Open "h:\My Documents\Projet 3\Resultat.xml" For Input As #1
Open "h:\My Documents\Projet 3\Resultat2.xml" For Output Access Write As #2


Do While Not EOF(1)

TempLettre = Input(1, #1)

If TempLettre <> ">" And TempLettre <> " " And TempLettre <> Chr(13) And TempLettre <> Chr(10) And TempLettre <> Chr(9) Then
TempMot = TempMot & TempLettre
Else
TempMot = TempMot & TempLettre

If TempLettre <> " " And TempLettre <> Chr(13) And TempLettre <> Chr(10) And TempLettre <> Chr(9) And TempMot <> TempMotDelete Then
Print #2, TempMot
Debug.Print TempMot
End If

If TempMot = TempMotDelete Then
TempSelectionDelete = TempSelectionDelete & TempMot

Do While Right(TempSelectionDelete, Len(TempMotDeleteFermeture)) <> TempMotDeleteFermeture
TempLettre = Input(1, #1)
TempSelectionDelete = TempSelectionDelete & TempLettre
Loop
TempSelectionDelete = ""
TempMot = TempMot & TempSelectionDelete
Else
TempMot = ""
End If
End If


Loop

Close #1
Close #2


End Sub



Mais il met UNE HEURE a traiter le fichier en question, et je pensais qu'il y avait plus rapide avec un traitement des balises...
 

MJ13

XLDnaute Barbatruc
Re : Recherche et suppression dans un .xml

Re Klass

Le problème est qu'on peut difficilement tester sur un code sans avoir un fichier XLM (avec des données anonymes) en indiquant quelles sont les données à remplacer. Le forum XLD n'a pas pour vocation de faire des jeux de pistes.
 
Dernière édition:

Klaas

XLDnaute Nouveau
Re : Recherche et suppression dans un .xml

<employee>
<name>John Doe</name>
<job>Software Analyst
<responsibility>Write technical specifications</responsibility>
<responsibility>Translate client requirements into software requirements</responsibility>
</job>

<hire_date>Jun 25, 2005</hire_date>
<salary>2000</salary>
</employee>

Je voudrais supprimer la balise en gras
 
Dernière édition:

2passage

XLDnaute Impliqué
Re : Recherche et suppression dans un .xml

re,

Pour l'optimisation de ce code, déjà il faudrait charger les lettres "len(TempMotDelete) par len(TempMotDelete)" et tester la valeur globale : ça limitera le nombre d'accès disque et le nombre de tests
Regarde aussi Ultraedit ou PSPAD, qui gèrent les macros et supportent mieux les volumes que notepad++

après c'est vrai que sans exemple...
++

Edit : tu es passé entre temps... je regarde ton exemple puis je réponds
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : Recherche et suppression dans un .xml

Re Klass, 2passage

Bon si j'ai bien compris (100 Mo cela commence à faire pas mal pour un fichier).

Si j'ai bien compris: voici ce que je ferai ( à condition qu'il faille bien supprimer les lignes entre <customBucketList>,.

Boucler sur toutes les lignes et si la ligne est égale à - <customBucketList>, attendre la prochaine pour pouvoir écrire à nouveau (peut être avec un goto).

Normalement, je traite des fichier de 60 Mo en moins d'une minute (enfin je ne sais pas trop car je ne reste pas devant le PC quand je le fais).
 

2passage

XLDnaute Impliqué
Re : Recherche et suppression dans un .xml

re

voici un code à tester. c'est instantané sur l'exemple mais il n'est pas gros.
Code:
Private Sub CommandButton1_Click()

Dim Testligne, BaliseOpen As String
Dim i As Integer
Dim Flagwrite As Boolean

BaliseOpen = "customBucketList"
Flagwrite = True

Open "f:\Testparse.txt" For Input As #1
Open "f:\Testresult.txt" For Output As #2

Do While Not EOF(1)
    Line Input #1, Testligne
    If Len(Testligne) - Len(BaliseOpen) > 0 Then
        For i = 1 To Len(Testligne) - Len(BaliseOpen)
            If Mid(Testligne, i, Len(BaliseOpen)) = BaliseOpen Then
                Flagwrite = False
                i = Len(Testligne) - Len(BaliseOpen)
            End If
        Next i
    End If
    If Flagwrite = True Then
        Print #2, Testligne
    End If
    If Len(Testligne) - Len(BaliseOpen) + 1 > 0 Then
        For i = 1 To Len(Testligne) - Len(BaliseOpen)
            If Mid(Testligne, i, Len(BaliseOpen) + 1) = "/" & BaliseOpen Then
                Flagwrite = True
                i = Len(Testligne) - Len(BaliseOpen) + 1
            End If
        Next i
    End If
Loop
Close #1
Close #2
End Sub
Nom de fichiers et nom de balise à mettre en variable au début du code
A tester sur du gros...
++
 

MJ13

XLDnaute Barbatruc
Re : Recherche et suppression dans un .xml

Re

Voici un fichier pour test (c'est un peu différent de 2passage mais cela y ressemble).
Mettre le fichier .txt à la racine du C:\ ou changer le chemin).
 

Pièces jointes

  • Extrait Klass.zip
    9.8 KB · Affichages: 160

Discussions similaires

Statistiques des forums

Discussions
312 778
Messages
2 092 039
Membres
105 162
dernier inscrit
djikon