Découper un fichier en plusieurs partie

Résolu/Fermé
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020 - Modifié le 7 août 2019 à 10:24
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020 - 8 août 2019 à 10:45
Bonjour,
Après avoir poser la même problématique côté shell (qui a obtenu une réponse brillante de dubcek), je me vois confronté à la même interrogation côté batch.
Il s'agit donc de découper le fichier.txt suivant:

#?COMMENCEMENT 
s_prenom='ALBERT' 
s_nom='DUPOND' 
s_sexe='masculin' 
s_aptitude='' 
s_definition='Habitant de France' 
s_groupe='HOMME' 
s_pseudo='' 
s_langue='' 
s_etranger='N' 
s_address='11.rue.Temple/7700' 
s_unformation='' 
s-profession='sans' 
#?FIN 
#?COMMENCEMENT 
s_prenom='FRED' 
s_nom='BACHELARD' 
s_sexe='masculin' 
s_aptitude='' 
s_definition='Habitant de France' 
s_groupe='HOMME' 
s_pseudo='' 
s_langue='' 
s_etranger='N' 
s_address='25.rue.Baltot/78114' 
s_unformation='' 
s-profession='sans' 
#?FIN
etc...


Comme vous pouvez le constater, ce fichier est constitué des balises suivantes:
#?COMMENCEMENT
#?FIN


Mon but est de découper le fichier autant de fois qu'il y a de balises afin d'obtenir plusieurs fichier.nn.txt (nn = numéro de fichier) avec le contenu suivant:
#?COMMENCEMENT 
s_prenom='ALBERT' 
s_nom='DUPOND' 
s_sexe='masculin' 
s_aptitude='' 
s_definition='Habitant de France' 
s_groupe='HOMME' 
s_pseudo='' 
s_langue='' 
s_etranger='N' 
s_address='11.rue.Temple/7700' 
s_unformation='' 
s-profession='sans' 
#?FIN


J'arrive pour l'instant à faire le travail en m'appuyant sur le nombre de lignes:
set "nLines=14"
set "line=0"

for /f "usebackq delims=" %%c in ("fichier.txt") do (
set /a "file=line/%nLines%", "line+=1"
for %%b in (!file!) do (>>"resultat_%%b.txt" echo.%%c)
)


ça marche très bien, sauf qu'il me semble plus prudent de m'appuyer sur les balises pour faire le découpage.
Auriez-vous une idée comment faire cette opération ?
Merci à vous ! :-)
Ka-El

**Modifié par la modération pour une lecture plus facile du code, à l'avenir utilisez les balises, VOIR CETTE PAGE

.
A voir également:

4 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
7 août 2019 à 10:53
hello
est-il envisageable d'utiliser awk pour DOS ?
http://gnuwin32.sourceforge.net/packages/gawk.htm
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié le 7 août 2019 à 15:28
essayer
@echo off
set c=1001
set s="FIN"
setlocal enabledelayedexpansion
for /f "delims=" %%a In (fichier.txt) Do (
    set n=fichier.!c:~-2!.txt
    echo %%a>> !n!
    echo %%a | findstr %s% > NUL
    if !errorlevel! EQU 0  (set /a c=!c!+1)
)
0
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
Modifié le 7 août 2019 à 16:41
Salut dubcek,
ça marche plutôt pas mal.
En revanche, je ne sais pas si j'ai bien fait, mais j'ai ajouté un timeout suite au script car il met un certain temps à se dérouler entièrement :
timeout/t 15 /nobreak >nul


je pose la question, car durant le processus, j'ai ces messages qui se sont affichés dans ma fenêtre dos:
. was unexpected at this time.
' was unexpected at this time.
. was unexpected at this time.
. was unexpected at this time.
. was unexpected at this time.
. was unexpected at this time.
. was unexpected at this time.
. was unexpected at this time.
. was unexpected at this time.
. was unexpected at this time.
' was unexpected at this time.
' was unexpected at this time.
' was unexpected at this time.
' was unexpected at this time.
. was unexpected at this time.
. was unexpected at this time.
. was unexpected at this time.
' was unexpected at this time.
. was unexpected at this time.
. was unexpected at this time.
. was unexpected at this time.
. was unexpected at this time.
. was unexpected at this time.
. was unexpected at this time.
.bat' was unexpected at this time.
' was unexpected at this time.
. was unexpected at this time.
' was unexpected at this time.
' was unexpected at this time.


C'est étrange, car le script semble donner le résultat attendu.
Quelle pourrait être la raison de cet affichage ?
Ka-El
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
7 août 2019 à 18:18
DOS c'est lent
montre le code
afficher la ligne en cours : (j'ai pas testé)
    if !errorlevel! EQU 0  (set /a c=!c!+1&set /A x=!c!-1000&echo !x!)
0
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
Modifié le 8 août 2019 à 05:52
Bonjour,

Je passe par ici vite fait ;)

Je n'ai pas le temps de tester mais voilà ce que j'aurais fait :

@echo off
set c=1001
setlocal enabledelayedexpansion

for /f "delims=" %%a In (fichier.txt) Do (
set n=!c:~-2!
echo %%a>> fichier_!n!.txt
if "%%a"=="#?FIN" (set /a c+=1)
)


0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
8 août 2019 à 10:41
probable que le if soit plus rapide que le findstr
0
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
8 août 2019 à 10:45
Je confirme c'est beaucoup plus rapide et je n'ai plus les erreurs indiquées ci-dessus.
Merci beaucoup à vous deux pour votre aide !
Vous êtes géniaux ! :-)
0