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

vrvrvr

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

1. Покажите пример исходного файла целиком.
2. Укажите кодировку файла (или прикрепите пример).
 
Пример исходного лог-файла (file.log) и итоговый файл (itog.txt) в аттаче.
Вообще-то требуется обработка только последней в исходном файле строки и конвертация её в итоговый файл...
 

Вложения

  • file.log
    430 байт · Просмотры: 3
  • itog.txt
    50 байт · Просмотры: 2
Батник сохранить в кодировке 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
 
Здесь в итоге получается не совсем то, что надо:
18.мар.2019
02:04:03
...
а надо, чтобы вместо "мар" было "03" (и все остальные месяцы, соответственно: янв -> 01, фев -> 02, ... дек -> 12.
 
Убрал переключение кодовой страницы (chcp 1251) и всё заработало!
Это неправильно. У вас перестанет работать код для месяца ноября. Нужно сделать так как написано в предыдущем сообщении.
(если конечно вы не перепутали, и исходный файл у вас действительно в кодировке ANSI).
 
На маленьком тестовом файле всё хорошо. В реале, когда лог от 100 кБ и более процесс занимает свыше 20 секунд.
А нельзя ли просто считать последнюю строку в file.log и работать только с ней?
 
Чтобы узнать где в файле находится последняя строка, нужно все равно читать полностью весь файл.
По поводу производительности, язык Batch не сможет вам дать больше без использования сторонних инструментов.
Вам необходимо воспользоваться другим языком или инструментами.
 
Спасибо, Dragokas. А всё-таки: можно ли в батнике (кодировка ANSI/DOS) реализовать замену месяцев-слов (янв фев мар ...) на их числа (01 02 03 ...) и запись в переменную, которую можно уже будет записать в итоговоый файл, например, командой echo ?
 
Назад
Сверху Снизу