merge multiple text files, removing all headers and the new header will be changed as follows

Une difficulté, une précision posez vos questions

Modérateur : WIN32-[GG]

Répondre
barnabe0057
King Of Batch
Messages : 85
Enregistré le : 24 janv. 2017 13:41

Re: merge multiple text files, removing all headers and the new header will be changed as follows

Message par barnabe0057 » 18 août 2019 04:57

Bonjour,

Je veux bien t'aider mais il me faudrait plusieurs fichiers pour faire des tests.

barnabe0057
King Of Batch
Messages : 85
Enregistré le : 24 janv. 2017 13:41

Re: merge multiple text files, removing all headers and the new header will be changed as follows

Message par barnabe0057 » 18 août 2019 22:19

J'ai déjà créé la première partie qui consiste à construire un nouveau header à partir de tous les fichiers textes :

Code : Tout sélectionner

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION
chcp 28591 >nul

: ----------------------------------------------------
: on teste la présence du fichier ADD.bat
: ----------------------------------------------------

if not exist "ADD.bat" (echo. & echo il manque le fichier ADD.bat ^^!^^!^^! & pause & exit)

: ----------------------------------------------------
: on traite tous les fichiers TXT
: ----------------------------------------------------

set nombre_de_lignes=0
set montant_total=0

for %%A in (*.txt) do (

	for /f "usebackq skip=1 delims=" %%E in ("%%~A") do (

		set /a nombre_de_lignes+=1

		set "ligne=%%~E"
		set amount=!ligne:~21,13!

		call ADD.bat !montant_total! !amount!

		set montant_total=!_ANSWER!

	)

	echo montant total : !montant_total! ##### lignes : !nombre_de_lignes! ##### "%%~A"

	set "last=%%~A"	
) 

: --------------------------------------------------------------
: on corrige le nombre de lignes en rajoutant des zéros
: --------------------------------------------------------------

set nombre_de_lignes=000000!nombre_de_lignes!
set nombre_de_lignes=!nombre_de_lignes:~-7!

: --------------------------------------------------------------
: on récupère le header du dernier fichier texte
: --------------------------------------------------------------

set count=0

for /f "usebackq delims=" %%K in ("!last!") do (
	set /a count+=1
	if !count! EQU 1 (set "first=%%~K")
)

: --------------------------------------------------------------
: on récupère la première et la dernière partie du header
: --------------------------------------------------------------

set unchangeable=!first:~0,21!
set "restant=!first:~41!"

: --------------------------------------------------------------
: on construit le nouveau header
: --------------------------------------------------------------

set header=!unchangeable!!montant_total!!nombre_de_lignes!!restant!

echo. & echo Header ==^>^> !header!

: --------------------------------------------------------------
: fin du script
: --------------------------------------------------------------

echo. & pause
exit
Tu peux le nommer comme tu veux, par exemple yazidioubi.bat

Pour fonctionner mon script a besoin d'un autre script qui sert à additionner les grands nombres, le voici :

Code : Tout sélectionner

@ECHO OFF
::SETLOCAL ENABLEEXTENSIONS
::SETLOCAL ENABLEDELAYEDEXPANSION

SET _FIRST=%1
SET _SECOND=%2
CALL :ADD _FIRST _SECOND _ANSWER
::ECHO !_ANSWER!

::ENDLOCAL
::ENDLOCAL
GOTO :END


:ADD
   ::ADD NUMBERS LARGER THAN 32-BITS
   ::SYNTAX: CALL ADD _VAR1 _VAR2 _VAR3
   ::VER 1.2
   ::hieyeque1@gmail.com - drop me a note telling me
   ::if this has helped you.  Sometimes I don't know if anyone uses my stuff
   ::Its free for the world to use.
   ::I retain the rights to it though, you may not copyright this
   ::to prevent others from using it, you may however copyright works
   ::as a whole that use this code.
   ::Just don't try to stop others from using this through some legal means.
   ::CopyRight Brian Williams 8/29/2009
   :: _VAR1 = VARIABLE FIRST NUMBER TO ADD
   :: _VAR2 = VARIABLE SECOND NUMBER TO ADD
   :: _VAR3 = VARIABLE NUMBER RETURNED
   SET _RESULT=
   SETLOCAL
   SET _NUM1=!%1!
   SET _NUM2=!%2!
   IF NOT DEFINED _NUM1 SET _NUM1=0
   IF NOT DEFINED _NUM2 SET _NUM2=0
   FOR /L %%A IN (1,1,2) DO (
      FOR /L %%B IN (0,1,9) DO (
         SET _NUM%%A=!_NUM%%A:%%B=%%B !
         )
      )
   FOR %%A IN (%_NUM1%) DO SET /A _NUM1CNT+=1 & SET _!_NUM1CNT!_NUM1=%%A
   FOR %%A IN (%_NUM2%) DO SET /A _NUM2CNT+=1 & SET _!_NUM2CNT!_NUM2=%%A
   SET _NUM1=%_NUM1: =%
   SET _NUM2=%_NUM2: =%
   SET /A _DIGITS=%_NUM1CNT% + %_NUM2CNT%
   IF %_DIGITS% LEQ 8 (
      SET /A _RESULT=%_NUM1% + %_NUM2%
      )
   IF DEFINED _RESULT (ENDLOCAL & SET %3=%_RESULT%& GOTO :EOF)
   IF %_NUM1CNT% GEQ %_NUM2CNT% (SET _MAXOPS=%_NUM1CNT%) ELSE (SET _MAXOPS=%_NUM2CNT%)
   SET /A _MAXOPS=%_MAXOPS% - 1
   IF %_NUM1CNT% GTR %_NUM2CNT% (
      SET /A _ZEROS=%_NUM1CNT% - %_NUM2CNT%
      FOR /L %%A IN (1,1,!_ZEROS!) DO SET _ZERO=!_ZERO!0
      SET _NUM2=!_ZERO!!_NUM2!
      )

   IF %_NUM2CNT% GTR %_NUM1CNT% (
      SET /A _ZEROS=%_NUM2CNT% - %_NUM1CNT%
      FOR /L %%A IN (1,1,!_ZEROS!) DO SET _ZERO=!_ZERO!0
      SET _NUM1=!_ZERO!!_NUM1!
      )

   FOR /L %%A IN (!_MAXOPS!,-1,0) DO (
      SET /A _TMP=!_NUM1:~%%A,1! + !_NUM2:~%%A,1! !_PLUS! !_CO!
      SET _CO=
      SET _PLUS=
      IF !_TMP! GTR 9 SET _CO=!_TMP:~0,1!& SET _TMP=!_TMP:~-1!& SET _PLUS=+
      SET _RETURN=!_TMP!!_RETURN!
      SET _TMP=
      )
   IF DEFINED _CO SET _RETURN=%_CO%%_RETURN%
   SET _RESULT=%_RETURN%
   IF DEFINED _RESULT (ENDLOCAL&SET %3=%_RESULT%)
   GOTO :EOF

:END
Tu devras le nommer ADD.bat

Les 2 scripts devront se trouver dans le même répertoire que les fichiers TXT à traiter.

Je te laisse la suite, ça ne devrait pas être très compliqué.

barnabe0057
King Of Batch
Messages : 85
Enregistré le : 24 janv. 2017 13:41

Re: merge multiple text files, removing all headers and the new header will be changed as follows

Message par barnabe0057 » 18 août 2019 23:40

Ok je vais t'aider pour la suite.

barnabe0057
King Of Batch
Messages : 85
Enregistré le : 24 janv. 2017 13:41

Re: merge multiple text files, removing all headers and the new header will be changed as follows

Message par barnabe0057 » 19 août 2019 00:08

Voilà la totalité du script :

Code : Tout sélectionner

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION
chcp 28591 >nul

set resultat=ALL_IN_ONE_CCP.txt

: ----------------------------------------------------
: on teste la présence du fichier ADD.bat
: ----------------------------------------------------

if not exist "ADD.bat" (echo. & echo il manque le fichier ADD.bat ^^!^^!^^! & pause & exit)

: ----------------------------------------------------
: on traite tous les fichiers TXT
: ----------------------------------------------------

set nombre_de_lignes=0
set montant_total=0

for /f "delims=" %%A in ('2^>nul dir /b /a-d "*.txt" ^| findstr /v "%resultat%"') do (

	for /f "usebackq skip=1 delims=" %%E in ("%%~A") do (

		set /a nombre_de_lignes+=1

		set "ligne=%%~E"
		set amount=!ligne:~21,13!

		call ADD.bat !montant_total! !amount!

		set montant_total=!_ANSWER!

	)

	echo ##### Traitement de "%%~A" en cours ...

	set "last=%%~A"	
)

: --------------------------------------------------------------
: on corrige le nombre de lignes en rajoutant des zéros
: --------------------------------------------------------------

set nombre_de_lignes=000000!nombre_de_lignes!
set nombre_de_lignes=!nombre_de_lignes:~-7!

: --------------------------------------------------------------
: on récupère le header du dernier fichier texte
: --------------------------------------------------------------

set count=0

for /f "usebackq delims=" %%K in ("!last!") do (

	set /a count+=1
	if !count! EQU 1 (set "first=%%~K")

)

: --------------------------------------------------------------
: on récupère la première et la dernière partie du header
: --------------------------------------------------------------

set unchangeable=!first:~0,21!
set "restant=!first:~41!"

: --------------------------------------------------------------
: on construit le nouveau header
: --------------------------------------------------------------

set header=!unchangeable!!montant_total!!nombre_de_lignes!!restant!

: --------------------------------------------------------------
: on construit un nouveau fichier avec toutes les lignes
: --------------------------------------------------------------

echo !header! > %resultat%

for /f "delims=" %%A in ('2^>nul dir /b /a-d "*.txt" ^| findstr /v "%resultat%"') do (

	for /f "usebackq skip=1 delims=" %%E in ("%%~A") do echo %%E >> %resultat%

)

: --------------------------------------------------------------
: fin du script
: --------------------------------------------------------------

pause
exit
Le nouveau fichier texte s'appelle ALL_IN_ONE_CCP.txt

Est-ce que tu dois supprimer tous les anciens fichiers ?

barnabe0057
King Of Batch
Messages : 85
Enregistré le : 24 janv. 2017 13:41

Re: merge multiple text files, removing all headers and the new header will be changed as follows

Message par barnabe0057 » 19 août 2019 21:53

J'aimerais bien t'aider mais je ne vois pas de quoi tu parles.

Est-ce que tu parles des espaces entre les noms et le chiffre 0 ou 1 à droite de chaque ligne ?

barnabe0057
King Of Batch
Messages : 85
Enregistré le : 24 janv. 2017 13:41

Re: merge multiple text files, removing all headers and the new header will be changed as follows

Message par barnabe0057 » 20 août 2019 21:51

Voilà c'est corrigé :

Code : Tout sélectionner

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION
chcp 28591 >nul

set resultat=ALL_IN_ONE_CCP.txt

: ----------------------------------------------------
: on teste la présence du fichier ADD.bat
: ----------------------------------------------------

if not exist "ADD.bat" (echo. & echo il manque le fichier ADD.bat ^^!^^!^^! & pause & exit)

: ----------------------------------------------------
: on traite tous les fichiers TXT
: ----------------------------------------------------

set nombre_de_lignes=0
set montant_total=0

for /f "delims=" %%A in ('2^>nul dir /b /a-d "*.txt" ^| findstr /v "%resultat%"') do (

	for /f "usebackq skip=1 delims=" %%E in ("%%~A") do (

		set /a nombre_de_lignes+=1

		set "ligne=%%~E"
		set amount=!ligne:~21,13!

		call ADD.bat !montant_total! !amount!

		set montant_total=!_ANSWER!

	)

	echo ##### Traitement de "%%~A" en cours ...

	set "last=%%~A"	
)

: --------------------------------------------------------------
: on corrige le nombre de lignes en rajoutant des zéros
: --------------------------------------------------------------

set nombre_de_lignes=000000!nombre_de_lignes!
set nombre_de_lignes=!nombre_de_lignes:~-7!

: --------------------------------------------------------------
: on récupère le header du dernier fichier texte
: --------------------------------------------------------------

set count=0

for /f "usebackq delims=" %%K in ("!last!") do (
	set /a count+=1
	if !count! EQU 1 (set "first=%%~K")
)

: --------------------------------------------------------------
: on récupère la première et la dernière partie du header
: --------------------------------------------------------------

set unchangeable=!first:~0,21!
set "restant=!first:~41!"

: --------------------------------------------------------------
: on construit le nouveau header
: --------------------------------------------------------------

set header=!unchangeable!!montant_total!!nombre_de_lignes!!restant!

: --------------------------------------------------------------
: on construit un nouveau fichier avec toutes les lignes
: --------------------------------------------------------------

echo !header!> %resultat%

for /f "delims=" %%A in ('2^>nul dir /b /a-d "*.txt" ^| findstr /v "%resultat%"') do (

	for /f "usebackq skip=1 delims=" %%E in ("%%~A") do echo %%E>> %resultat%

)

: --------------------------------------------------------------
: fin du script
: --------------------------------------------------------------

echo. & pause
exit

Répondre