Потребовалось получить данные из лог-файла (год месяц число в виде "2019 мар 17") и вписать эту дату в другой текстовой файл, но в виде ДД.ММ.ГГГГ.
Можно ли это сделать в BAT ?
Пример исходного лог-файла (file.log) и итоговый файл (itog.txt) в аттаче.
Вообще-то требуется обработка только последней в исходном файле строки и конвертация её в итоговый файл...
@echo off
SetLocal EnableExtensions
set "src=file.log"
set "dst=itog.txt"
@chcp 1251>nul
@<"%src%">"%src%.tmp" (for /f "delims=" %%i in ('find/n /v ""') do @chcp 866>nul& set x=%%i& cmd/v/c echo[!x:*]^^=!)
for /f "UseBackQ delims=[] tokens=1,3,5" %%a in ("%src%.tmp") do set dat=%%a& set type=%%b& set id=%%c
for /f %%a in ("%type%") do set type=%%a
for /f "tokens=1-4 delims=, " %%a in ("%dat%") do set yyyy=%%a& set mm=%%b& set dd=%%c& set tim=%%d
for %%a in (янв-01 фев-02 мар-03 апр-04 май-05 июн-06 июл-07 авг-08 сен-09 окт-10 ноя-11 дек-12) do (
for /f "tokens=1,2 delims=-" %%b in ("%%a") do if "%mm%"=="%%b" set mm=%%c
)
(
echo %dd%.%mm%.%yyyy%
echo %tim%
echo %type%
echo pool-2-thread-%id%
) > "%dst%"
del "%src%.tmp"
pause
Здесь в итоге получается не совсем то, что надо:
18.мар.2019
02:04:03
...
а надо, чтобы вместо "мар" было "03" (и все остальные месяцы, соответственно: янв -> 01, фев -> 02, ... дек -> 12.
Это неправильно. У вас перестанет работать код для месяца ноября. Нужно сделать так как написано в предыдущем сообщении.
(если конечно вы не перепутали, и исходный файл у вас действительно в кодировке ANSI).
На маленьком тестовом файле всё хорошо. В реале, когда лог от 100 кБ и более процесс занимает свыше 20 секунд.
А нельзя ли просто считать последнюю строку в file.log и работать только с ней?
Чтобы узнать где в файле находится последняя строка, нужно все равно читать полностью весь файл.
По поводу производительности, язык Batch не сможет вам дать больше без использования сторонних инструментов.
Вам необходимо воспользоваться другим языком или инструментами.
Спасибо, Dragokas. А всё-таки: можно ли в батнике (кодировка ANSI/DOS) реализовать замену месяцев-слов (янв фев мар ...) на их числа (01 02 03 ...) и запись в переменную, которую можно уже будет записать в итоговоый файл, например, командой echo ?