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