.png)
Предположим, у меня есть этот текстовый файл:
1234567890123456789012345678901234567890123456789012345678901234567890
_________1_________2_________3_________4_________5_________6_________7
*0000000000003000345800185000000000000002052017108018010009990
*000000000000302082890010000000000T SECTEUR SANITAIRE JIJEL 1
*000000000000306758680008500000000TIC ZIAMA MANSOURIAH 1
Заголовок и все строки содержат 62 символа. Если вы посмотрите на заголовок и начнете с позиции 42, то увидите 022017
, 02
— текущий месяц, 2017
— год; с позиции 48 по 62 (т. е. после 052017
) у нас есть 14 значений ( 10801801000999
) и a 0
(ноль).
Последняя строка содержит или, скажем так, не идентична другим строкам.
Допустим, у меня есть несколько файлов одинаковой структуры; и я хочу установить дату в заголовке на текущую дату (сейчас август 2019 года, поэтому я хочу попасть 082019
в заголовок вместо 052017
). После даты ( 052017
) я хочу удалить значения, которые идут после (в данном случае ( 10801801000999
) и заменить их пробелами и сохранить значение (0), таким образом, чтобы заголовок сохранил свои 62 символа. Может ли кто-нибудь помочь мне написать какой-нибудь код (пакетный файл: .bat) для выполнения этой работы? Особенно, если у меня есть несколько текстовых файлов, и каждый из них содержит более 5000 строк.
решение1
Следующая партия будет
- перебирать файлы *.txt в текущей папке,
- переименуйте оригинал в расширение .bak
- прочитать заголовок, изменить и записать его под исходным именем
- скопируйте оставшуюся часть сохраненного файла
Кстати, SuperUser — это не сервис по написанию скриптов,
можно было бы ожидать немного больше собственных исследований и попыток кодирования.
:: 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
Пример вывода:
> SU_1472064.cmd
1234567890123456789012345678901234567890123456789012345678901234567890
_________1_________2_________3_________4_________5_________6_________7
*0000000000003000345800185000000000000002052017108018010009990
*0000000000003000345800185000000000000002082019 0
Job done