Modifique um arquivo de texto sem criar outro com um arquivo em lote (.bat)

Modifique um arquivo de texto sem criar outro com um arquivo em lote (.bat)

Suponhamos que eu tenha este arquivo de texto:

1234567890123456789012345678901234567890123456789012345678901234567890
_________1_________2_________3_________4_________5_________6_________7
*0000000000003000345800185000000000000002052017108018010009990
*000000000000302082890010000000000T SECTEUR SANITAIRE JIJEL  1
*000000000000306758680008500000000TIC ZIAMA MANSOURIAH       1

O cabeçalho e todas as linhas contêm 62 caracteres. se você olhar o cabeçalho e começar na posição 42 022017, verá que 02é o mês atual e 2017é o ano; da posição 48 a 62 (ou seja, depois de 052017) temos 14 valores ( 10801801000999) e a 0(zero).

A última linha contém ou digamos que não é idêntica às outras linhas.

Digamos que tenho vários arquivos da mesma estrutura; e quero definir a data no cabeçalho para a data atual (estamos em agosto de 2019, então quero entrar 082019no cabeçalho em vez de 052017). Após a data ( 052017) quero retirar os valores que vêm depois (neste caso ( 10801801000999) e substituí-los por espaços e manter o valor (0), de forma que o cabeçalho mantenha seus 62 caracteres. Alguém pode me ajudar a escrever alguns código (um arquivo em lote: .bat) para fazer o trabalho? Principalmente se eu tiver vários arquivos de texto e cada um deles contiver mais de 5.000 linhas.

Responder1

O lote seguinte será

  • iterar arquivos *.txt na pasta atual,
  • renomeie o original para extensão .bak
  • leia o cabeçalho, modifique e grave-o no nome original
  • copie o restante do arquivo salvo

A propósito, o SuperUser não é um serviço de escrita de scripts;
um pouco mais de pesquisa própria e tentativas de codificação podem ser esperadas.

:: Q:\Test\2019\08\16\SU_1472064.cmd
@Echo off
:: Get MonthYear
for /f "usebackq" %%A in (`
  powershell -NoP -C "(Get-Date).ToString('MMyyyy')"
`) Do Set MonthYear=%%A

:: iterate .txt files in current folder
For /f "delims=" %%F in ('Dir /B /O-D *.txt') Do Call :sub "%%~F"
Echo Job done

Goto :Eof

:Sub filename
:: Rename original file to .bak extension
Ren %1 "%~1.bak"
:: read header line
Set /p "Header=" <"%~1.bak"
Echo 1234567890123456789012345678901234567890123456789012345678901234567890
Echo _________1_________2_________3_________4_________5_________6_________7
Echo %Header%
Set "NewHeader=%Header:~0,41%%MonthYear%              0"
Echo %NewHeader%
(Echo %NewHeader%
 More +1 "%~1.bak"
) > %1

Exemplo de saída:

> SU_1472064.cmd
1234567890123456789012345678901234567890123456789012345678901234567890
_________1_________2_________3_________4_________5_________6_________7
*0000000000003000345800185000000000000002052017108018010009990
*0000000000003000345800185000000000000002082019              0
Job done

informação relacionada