IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Découpage d'un fichier XML


Sujet :

Scripts/Batch

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 44
    Points : 25
    Points
    25
    Par défaut Découpage d'un fichier XML
    bonjour,
    j'ai un fichier XML que je souhaite découper en plusieurs
    c'est une tache un peu ennuyeuse à faire à la main, j'ai donc automatisé
    par contre, la méthode employée est un peu lente

    j'ai fait une phase de caclul qui me permet d'avoir le nom du fichier, la ligne de début et la ligne de fin.

    en fait je cherche a copier les lignes X à Y dans un fichier, puis Y+1 à Z dans un autre etc …

    pour le moment j'ai opté pour un fichier avec une numérotation, mais ca alourdi le traitement qui prend plusieurs heure,
    j'ai pas trouver l'astuce pour copier un range de ligne d'un fichier à l'autre.

    le batch fonctionne parfaitement mais il est lent


    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    @Echo OFF
    setlocal enabledelayedexpansion 
    cls
     
    set datetimetmp=%date:~6,4%%date:~3,2%%date:~0,2%_%time:~0,2%%time:~3,2%%time:~6,2%
    set datetimetmp=%datetimetmp: =%
     
    Set Tablefile=toto.xml
     
    Set /A compteur_table=3 
     
     
    rem comptage du nombre de table : 
    for /f "tokens=2,3* delims=:" %%j in ('find /c "<name>" temp.num') do SET nbtable=%%j 
     
     
    REM trouver les N° de ligne 
    del idligne.txt
    for /f "tokens=1,2* delims=[]" %%j in ('find /n "<statusCodeTable action=" %Tablefile%') do  (
     	echo %%j >> idligne.txt
     )
    for /f "tokens=2,3* delims=:" %%j in ('find /c /v "testnbligne" %Tablefile%') do echo %%j >>idligne.txt
     
     
     
    echo Numérotation des fichiers
    find /v /n "none" %Tablefile%> temp.num
    find /v /n "none" idligne.txt> idligne.num
    del idligne.txt
    del range.txt
     
     
    for /f "tokens=1,2* delims=[]" %%j in ('find /n "<statusCodeTable action=" %Tablefile%') do  (
    	rem echo %%j
    	Set LineNumber=%%j
    	SET /A LineNumberName=LineNumber+1
    	for /f "tokens=3,4* delims=><" %%m in ('find "[!LineNumberName!]" temp.num') do (
     
    for /f "tokens=2,4* delims=]" %%h in ('find "[!compteur_table!]" idligne.num') do set fin=%%h
    rem echo %compteur_table%
    echo %%m:!LineNumberName!:!fin!>>range.txt
    	SET /A compteur_table+=1
    rem echo %compteur_table%
    )
     
    )
     
     
    for /f "tokens=1,2* delims=:" %%i in (range.txt) do ( 
    echo preparation du fichier %%i.xml, lignes %%j a %%k
    set /A LineNumberPartielFin=%%k-1
    rem echo !LineNumberPartielFin!
    set LineNumberPartiel=%%j
    rem echo !LineNumberPartiel!
     
     
    Copy entete.txt %%i.xml
    	for /L  %%b in (%%j,1,!LineNumberPartielFin!) do (
    	for /f "tokens=2,3* delims=]" %%c in ('find "[!LineNumberPartiel!]" temp.num') do echo %%c>>%%i.xml
    	SET /A LineNumberPartiel+=1
    	rem echo !LineNumberPartiel!
    	)
     
    for /f "tokens=2,3* delims=:" %%g in ('find /c /v "testnbligne" %Tablefile%') do Set LigneEof=%%g
     
    set /A RangeEof=LigneEof-2
     
    	for /L  %%b in (!RangeEof!,1,!LigneEof!) do (
    	for /f "tokens=2,3* delims=]" %%c in ('find "[!RangeEof!]" temp.num') do echo %%c>>%%i.xml
    	SET /A RangeEof+=1
    	rem echo !LineNumberPartiel!
    	)
    )

    la première partie du code me permet d'identifier le Nom des différents fichier, ainsi que le nombre de ligne :
    je place tout ca dans un fichier au format :
    NOM : ligne de début : ligne de fin

    FICHIER1:6:316
    FICHIER2:317:18757
    FICHIER3:18758:36160
    FICHIER4:36161:53563
    FICHIER5:53564:71932
    FICHIER6:71933:76029
    FICHIER7:76030:83072
    FICHIER8:83073:89935
    FICHIER9:89936:103596
    FICHIER10:103597:110819
    FICHIER11:110820:117502
    FICHIER12:117503:131889
    FICHIER13:131890: 132196

    je pense qu'il doit y avoir une astuce avec le skip et le /B de la boucle for, mais j'ai pas trouvé


    pour le moment la méthode moche c'est ca:

    j'ai un fichier miroir avec le numero de ligne (find / C)
    puis je recherche le N° de ligne en incrémentant

    mais ce serait plus efficace de dire je copie à partir de .. (option skip de la boucle for)
    et je vais jusqu'à la ligne Y (option B de la boucle for ?)



    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Copy entete.txt %%i.xml
    	for /L  %%b in (%%j,1,!LineNumberPartielFin!) do (
    	for /f "tokens=2,3* delims=]" %%c in ('find "[!LineNumberPartiel!]" temp.num') do echo %%c>>%%i.xml
    	SET /A LineNumberPartiel+=1
    	rem echo !LineNumberPartiel!
    	)
     
    for /f "tokens=2,3* delims=:" %%g in ('find /c /v "testnbligne" %Tablefile%') do Set LigneEof=%%g
     
    set /A RangeEof=LigneEof-2
     
    	for /L  %%b in (!RangeEof!,1,!LigneEof!) do (
    	for /f "tokens=2,3* delims=]" %%c in ('find "[!RangeEof!]" temp.num') do echo %%c>>%%i.xml
    	SET /A RangeEof+=1
    	rem echo !LineNumberPartiel!
    	)
    )


    pour l'entête et la fin de fichier j'ai opté pour une entête préparé dans un fichier et pour la fin de fichier je vais prendre les 3 dernières lignes de mon fichier, tout simplement.


    d'avance merci à ceux qui pourront m'aider à optimiser ce batch

    Cordialement

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    j'ai trouvé un peu plus rapide : (dans la FAQ)

    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    for /f "tokens=1,* delims=:" %%s in ('findstr /n /r . %Tablefile%') do if %%s geq !LineNumberPartiel! if %%s leq !LineNumberPartielFin! echo %%t>>%%i.xml


    mais il est vrai que j'aimerais ne pas traité tout le fichier
    si on dépasse la ligne max on passe au fichier suivant, la je traite le fichier 13 fois

    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    for /f "tokens=1,* delims=:" %%s in ('findstr /n /r . %Tablefile%') do if%%s eq !LineNumberPartielFin! goto next  if %%s geq !LineNumberPartiel! if %%s leq !LineNumberPartielFin! echo %%t>>%%i.xml

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    du fait j'ai gardé la forme :
    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    for /f "tokens=1,* delims=:" %%s in ('findstr /n /r . %Tablefile%') do if %%s geq !LineNumberPartiel! if %%s leq !LineNumberPartielFin! echo %%t>>%%i.xml

    Je traite un fichier de 150000 lignes en 1h pour le découper en X fichiers, je suis donc dans le raisonnable.

    Ça marche, je pense qu'il y a plus rapide mais je n'ai pas trouvé (j'ai essayé avec more ou type mais sans succès).

    Je mets en résolu, le code fourni permet bien de découper du XML mais si certains ont un version rapide pour extraire une plage de lignes d'un fichier vous êtes les bienvenues.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Découpage du fichier XML en 3 niveaux
    Par dorra1987 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 08/01/2015, 09h50
  2. Découpage fichier XML
    Par Foyus dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 06/01/2015, 17h43
  3. [SAX] Découpage fichier xml
    Par akhen3100 dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 06/03/2009, 09h59
  4. Balises HTML dans un fichier XML
    Par Bastet79 dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 04/09/2002, 15h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo