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
Partager