[CMD] Замена названий месяцев в текстовом файле

vrvrvr

Новый пользователь
Сообщения
6
Реакции
0
Потребовалось получить данные из лог-файла (год месяц число в виде "2019 мар 17") и вписать эту дату в другой текстовой файл, но в виде ДД.ММ.ГГГГ.
Можно ли это сделать в BAT ?
 

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,782
Реакции
6,241
Здравствуйте, @vrvrvr!
Добро пожаловать на SafeZone.

1. Покажите пример исходного файла целиком.
2. Укажите кодировку файла (или прикрепите пример).
 

vrvrvr

Новый пользователь
Сообщения
6
Реакции
0
Пример исходного лог-файла (file.log) и итоговый файл (itog.txt) в аттаче.
Вообще-то требуется обработка только последней в исходном файле строки и конвертация её в итоговый файл...
 

Вложения

  • file.log
    430 байт · Просмотры: 3
  • itog.txt
    50 байт · Просмотры: 2

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,782
Реакции
6,241
Батник сохранить в кодировке OEM-866.

CMD/BATCH:
@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
 

vrvrvr

Новый пользователь
Сообщения
6
Реакции
0
Здесь в итоге получается не совсем то, что надо:
18.мар.2019
02:04:03
...
а надо, чтобы вместо "мар" было "03" (и все остальные месяцы, соответственно: янв -> 01, фев -> 02, ... дек -> 12.
 

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,782
Реакции
6,241
Убрал переключение кодовой страницы (chcp 1251) и всё заработало!
Это неправильно. У вас перестанет работать код для месяца ноября. Нужно сделать так как написано в предыдущем сообщении.
(если конечно вы не перепутали, и исходный файл у вас действительно в кодировке ANSI).
 

vrvrvr

Новый пользователь
Сообщения
6
Реакции
0
На маленьком тестовом файле всё хорошо. В реале, когда лог от 100 кБ и более процесс занимает свыше 20 секунд.
А нельзя ли просто считать последнюю строку в file.log и работать только с ней?
 

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,782
Реакции
6,241
Чтобы узнать где в файле находится последняя строка, нужно все равно читать полностью весь файл.
По поводу производительности, язык Batch не сможет вам дать больше без использования сторонних инструментов.
Вам необходимо воспользоваться другим языком или инструментами.
 

vrvrvr

Новый пользователь
Сообщения
6
Реакции
0
Спасибо, Dragokas. А всё-таки: можно ли в батнике (кодировка ANSI/DOS) реализовать замену месяцев-слов (янв фев мар ...) на их числа (01 02 03 ...) и запись в переменную, которую можно уже будет записать в итоговоый файл, например, командой echo ?
 
Сверху Снизу