Войти

Показать полную графическую версию : Выбрать из ТХТ строки с датами заданного периода


surgutfred
26-02-2016, 07:12
Добрый день.
Есть куча тхт файлов я с помощью bat файла выбираю только строки со словом Отключение

rem Оставляем только строки со словом отключение
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir "#*.txt" /a-d /b') do (
findstr /c:"Отключение" "%%i">log.tmp
del "%%i"
move log.tmp "%%i"
)

Получились такие строки
20.01.2016 208980 Отключение
25.01.2016 148557 Отключение
20.02.2016 280087 Отключение
25.02.2016 289205 Отключение

Мне теперь что нужно - задать временной период типа
set nachalo=26.01.16
set konec=25.02.16

и оставить в каждом файле только те строки, которые соответствуют этому периоду
Заранее спасибо за помощь.

Iska
26-02-2016, 07:48
surgutfred, попробуйте воспользоваться для этого LogParser'ом (Средство Log Parser 2.2 (https://technet.microsoft.com/ru-ru/scriptcenter/dd919274.aspx)). Возможно также, что и предварительно отбирать строки не придётся.

surgutfred
04-03-2016, 07:43
Хотелось бы без лишнего софта, на бат файле. Будем думать.

Iska
04-03-2016, 08:30
surgutfred, дело в том, что в пакетных файлах нет такого понятия как переменная и её тип. Следовательно, язык пакетных файлов ничего не знает о таком типе данных, как дата, и не имеет никаких средств для работы с ними. Можно, конечно, поизвращаться от полной безвыходности, но зачем?

Я показал, каким образом это можно сделать быстро и просто — одним SQL-запросом. Хотите исключительно встроенными средствами — можно использовать WSH или PoSH. Главный вопрос в объёмах обработки. Если это сотни килобайт — одно дело, сотни мегабайт — совсем-совсем другое, и в последнем случае равных LogParser'у нет.

P.S. Чем он Вам не нравится? Родное средство от Microsoft.

greg zakharov
04-03-2016, 09:49
Не, LogParser - это от Лукавого, лучше уж действительно одним SQL-запросом все решить. Но если кто-то не ищет легких путей и предположить, что полученные файлы выглядят примерно так:
#file1.txt
20.01.2016 208980 Отключение
25.01.2016 148557 Отключение
20.02.2016 280087 Отключение
25.02.2016 289205 Отключение
...
#fileN.txt
20.01.2016 208980 Отключение
25.01.2016 148557 Отключение
20.02.2016 280087 Отключение
25.02.2016 289205 Отключение
...
То на бате вытащить нужные строки можно примерно так:
@echo off
setlocal
chcp 1251>nul
for /f "tokens=1,* delims=:" %%i in (
'findstr /rc:"^25\.0[1|2]\.2016" #*.txt'
) do echo:%%j>>%%~ni.modified%%~xi
endlocal&chcp 866>nul
exit /b

Iska
04-03-2016, 10:12
Не, LogParser - это от Лукавого, лучше уж действительно одним SQL-запросом все решить. »
LogParser — это и есть «один SQL-запрос».

То на бате вытащить нужные строки можно примерно так:

'findstr /rc:"^25\.0[1|2]\.2016" #*.txt'
… »
На мой взгляд, это совсем не то, что:
Мне теперь что нужно - задать временной период типа
set nachalo=26.01.16
set konec=25.02.16
и оставить в каждом файле только те строки, которые соответствуют этому периоду »

greg zakharov
04-03-2016, 10:48
LogParser — это и есть «один SQL-запрос».Речь про исходный код самого LogParser'а, к обычным файлам можно также как к БД обращаться - чай вестимо.
На мой взгляд, это совсем не то...
Оведно:
оставить в каждом файле только те строки, которые соответствуют этому периоду
Но если захватывать записи между этими двумя значениями, то лучше действительно использовать PowerShell.

Iska
04-03-2016, 11:01
Оведно »
Переведите.

greg zakharov
04-03-2016, 11:07
Iska, ужель запамятовали? (http://forum.oszone.net/showpost.php?p=2566690&postcount=10)

Elven
04-03-2016, 11:09
Iska, оведно (http://forum.oszone.net/post-2566690-10.html)

Iska
04-03-2016, 11:32
greg zakharov, Elven, конечно, запамятовал, ибо не знал и не сталкиваюсь ни в письме, ни в речи. Спасибо, ясно.




© OSzone.net 2001-2012