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

vrvrvr

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,128
Реакции
5,903
Баллы
648
Здравствуйте, @vrvrvr!
Добро пожаловать на SafeZone.

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

vrvrvr

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

Вложения

  • 430 байт Просмотры: 2
  • 50 байт Просмотры: 1

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,128
Реакции
5,903
Баллы
648
Батник сохранить в кодировке 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
Баллы
1
Здесь в итоге получается не совсем то, что надо:
18.мар.2019
02:04:03
...
а надо, чтобы вместо "мар" было "03" (и все остальные месяцы, соответственно: янв -> 01, фев -> 02, ... дек -> 12.
 

vrvrvr

Новый пользователь
Сообщения
6
Реакции
0
Баллы
1
Убрал переключение кодовой страницы (chcp 1251) и всё заработало!
Спасибо, Dragokas!
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,128
Реакции
5,903
Баллы
648
Убрал переключение кодовой страницы (chcp 1251) и всё заработало!
Это неправильно. У вас перестанет работать код для месяца ноября. Нужно сделать так как написано в предыдущем сообщении.
(если конечно вы не перепутали, и исходный файл у вас действительно в кодировке ANSI).
 

vrvrvr

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,128
Реакции
5,903
Баллы
648
Чтобы узнать где в файле находится последняя строка, нужно все равно читать полностью весь файл.
По поводу производительности, язык Batch не сможет вам дать больше без использования сторонних инструментов.
Вам необходимо воспользоваться другим языком или инструментами.
 

vrvrvr

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,128
Реакции
5,903
Баллы
648
Ну так а выше код это что?
 
Сверху Снизу