Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Ksanteri
0 / 0 / 0
Регистрация: 25.08.2016
Сообщений: 10
1

Как скопировать часть текста txt-файла в виде списка событий c условием - текущая дата? - BAT

29.08.2016, 10:06. Просмотров 1238. Ответов 21

Здравствуйте, уважаемые форумчане! Очень надеюсь на Вашу профессиональную помощь в следующей задаче.

Есть txt-файл "массив данных" в виде списка событий, привязанных к дате события:
"...
26/08/2016;12:43:25; Событие n;
26/08/2016;13:15:05; Событие n+1;
27/08/2016;09:16:28; Событие n+2;
27/08/2016;10:42:09; Событие n+3;
27/08/2016;11:43:26; Событие n+4;
29/08/2016;09:27:35; Событие n+5;"
Как скопировать строки с событиями за текущую дату в другой txt-файл "события за день X"?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2016, 10:06
Ответы с готовыми решениями:

Как скопировать часть текста из файла?
Есть текстовый файл foo: ййййййй ццццццц уууууууу ; яяяяяяяя аааааааа нннннннн Как...

Скопировать нужный фрагмент текста из txt-файла
такая проблема, никак не получается скопировать нужный фрагмент из текста... код : string s =...

Как скопировать текст с файла 1.txt и записать в 2.txt
1)Скажите, как скопировать кусок текста с файла 1.txt и записать в 2.txt? 2)Как вместо этого,...

Текущая дата в имя файла
нужно добавить дату в имя сохраняемого файла, поползав по сети и объеденив часть кодов получил это ...

Текущая дата в названии нового файла.
Помогите, я создаю при архивации новый файл БД, при ентом мне нужно чтобы в его названии...

21
greg zakharov
Покинул форум
2245 / 911 / 252
Регистрация: 07.05.2015
Сообщений: 1,801
29.08.2016, 10:16 2
Windows Batch file
1
2
3
4
5
6
7
@echo off
   chcp 1251>nul
      for /f "tokens=3 delims=;" %%i in (
         'findstr /brc:"%date:.=/%" file.txt'
      ) do echo:%%i>>newfile.txt
   chcp 866>nul
exit /b
1
YuS_2
Любознательный
1103 / 637 / 194
Регистрация: 10.03.2016
Сообщений: 1,481
29.08.2016, 10:25 3
Цитата Сообщение от Ksanteri Посмотреть сообщение
Как скопировать строки с событиями за текущую дату в другой txt-файл "события за день X"?
Понятно, что имеется файл, но не совсем понятно, в чем именно возникает проблема?
Если требуется копирование - копируйте файл. Или требуется выборка строк? Если выборка, то по какому признаку (по дате? по номеру события? и что это за n+1, n+2 ... - это отображение того, что написано в файле или это гипотетическая формула нумерации строк? Или это вообще, задание для студентов?) - в общем, распишите подробнее.
0
Ksanteri
0 / 0 / 0
Регистрация: 25.08.2016
Сообщений: 10
29.08.2016, 10:41  [ТС] 4
Спасибо greg zakharov и YuS_2 за оперативные ответы!
Поясняю. В имеющемся файле "массив событий" n строк - то есть их количество не известно. То есть n+1, n+2 - это "гипотетическая формула нумерации строк". В начале каждой строки стоит дата - это дата записи этой строки в файл. Требуется выборка строк с текущей датой в другой файл.
0
29.08.2016, 10:41
YuS_2
Любознательный
1103 / 637 / 194
Регистрация: 10.03.2016
Сообщений: 1,481
29.08.2016, 10:52 5
Цитата Сообщение от Ksanteri Посмотреть сообщение
Требуется выборка строк с текущей датой в другой файл.
А, ну тогда уже решение есть...
Правда там сделан вывод определенного токена... но если требуется вывод строк целиком, то его немного надо видоизменить
0
Ksanteri
0 / 0 / 0
Регистрация: 25.08.2016
Сообщений: 10
29.08.2016, 11:04  [ТС] 6
Желательно вывести разумеется всю строку с датой и временем. Но это не критично. Подскажите, где я допускаю ошибку - при запуске этого bat-файла не происходит ничего - не создается файл "newfile.txt", cmd не выдает никаких ошибок на код. Запускаю этот bat-файл в директории, где находится исходный массив данных - "file.txt".
0
YuS_2
Любознательный
1103 / 637 / 194
Регистрация: 10.03.2016
Сообщений: 1,481
29.08.2016, 11:21 7
Цитата Сообщение от Ksanteri Посмотреть сообщение
вывести разумеется всю строку с датой и временем.
замените в tokens тройку на астериск
Windows Batch file
1
... "tokens=* ...
Цитата Сообщение от Ksanteri Посмотреть сообщение
при запуске этого bat-файла не происходит ничего
включите вывод echo
Windows Batch file
1
@echo on
и добавьте паузу перед командой выхода. Посмотрите, что именно "не нравится" интерпретатору.
0
Ksanteri
0 / 0 / 0
Регистрация: 25.08.2016
Сообщений: 10
29.08.2016, 11:43  [ТС] 8
Так вот я и имею ввиду, что интерпретатору все вроде как и нравиться - сделал скриншот - смотрите в приложении. Ошибок нет. Не обращайте внимание на последнее предложение в интепретаторе - Jatka painamalla mita tahansa nappainta ... - это с финского "Для продолжения нажмите любую клавишу ...".
Код bat-файла выглядит сейчас так:
@echo on
chcp 1251>nul
for /f "tokens=* delims=;" %%i in (
'findstr /brc:"%date:.=/%" file.txt'
) do echo:%%i>>newfile.txt
chcp 866>nul
pause
exit /b
0
Миниатюры
Как скопировать часть текста txt-файла в виде списка событий c условием - текущая дата? - BAT  
greg zakharov
Покинул форум
2245 / 911 / 252
Регистрация: 07.05.2015
Сообщений: 1,801
29.08.2016, 12:02 9
Лучший ответ Сообщение было отмечено Ksanteri как решение

Решение

YuS_2, зачем плохому учите? Если нужна строка целиком, вообще цикл не нужен.
Windows Batch file
1
2
3
4
5
@echo off
   chcp 1251>nul
      findstr /brc:"%date:.=/%" file.txt>>newfile.txt
   chcp 866>nul
exit /b
1
YuS_2
Любознательный
1103 / 637 / 194
Регистрация: 10.03.2016
Сообщений: 1,481
29.08.2016, 12:08 10
Цитата Сообщение от Ksanteri Посмотреть сообщение
Не обращайте внимание на последнее предложение в интепретаторе - Jatka painamalla mita tahansa nappainta ... - это с финского "Для продолжения нажмите любую клавишу ...".
Да нет, это как раз, важно...
Обратите внимание, что у Вас раскрывается в батнике, в команде findstr:
Windows Batch file
1
...findstr /brc:"ma 29/08/2016" ...
с таким шаблоном в Вашем текстовом файле ничего не будет найдено.

Покажите, что у Вас выводится по команде:
Windows Batch file
1
echo %date%
0
Ksanteri
0 / 0 / 0
Регистрация: 25.08.2016
Сообщений: 10
29.08.2016, 12:18  [ТС] 11
ааа, здесь Вы правы!
На команду echo %date% выдает следующее:
"ma 29.08.2016"
Тогда как в файле "массив данных" дата содержит "/" символ вместо точки.
Можно ли просто заменить все "/" на "."? А как быть с "ma" в дате? "ma" - это сокращение понедельника с финского.
0
YuS_2
Любознательный
1103 / 637 / 194
Регистрация: 10.03.2016
Сообщений: 1,481
29.08.2016, 12:36 12
Цитата Сообщение от greg zakharov Посмотреть сообщение
зачем плохому учите?
почему плохому? Да, без цикла, конечно, лучше для конкретной задачи. Но завтра ведь может понадобиться вывод части строки, а тут уже готовое решение, только выбирай токен... в смысле, в целях универсальности, опыт использования цикла лучше.

Добавлено через 17 минут
Цитата Сообщение от Ksanteri Посмотреть сообщение
Можно ли просто заменить все "/" на "."?
В приведенном выше решении, эта замена есть, необходимо только отсечь лишнее перед цифрами. Можно добавить строку перед фильтром (или если используется цикл, то перед циклом) так:
Windows Batch file
1
set oDate=%date:~3%
а потом заменить уже:
Windows Batch file
1
...findstr /brc:"%oDate:.=/%" ...
0
Ksanteri
0 / 0 / 0
Регистрация: 25.08.2016
Сообщений: 10
29.08.2016, 12:52  [ТС] 13
Цитата Сообщение от YuS_2 Посмотреть сообщение
В приведенном выше решении, эта замена есть
Мда, позор на мою голову)

После отсекания "ma" критерий поиска выглядит правильно - "29/08/2016", однако результут тот же - ничего.
Вложил в приложение скриншот и bat-файл с файлом "массив данных".

Код сейчас выглядит так:
@echo on
set oDate=%date:~3%
chcp 1251>nul
findstr /brc:"%oDate:.=/%" file.txt>>newfile.txt
chcp 866>nul
pause
exit /b
0
Миниатюры
Как скопировать часть текста txt-файла в виде списка событий c условием - текущая дата? - BAT  
Вложения
Тип файла: 7z TEST.7z (423 байт, 4 просмотров)
YuS_2
Любознательный
1103 / 637 / 194
Регистрация: 10.03.2016
Сообщений: 1,481
29.08.2016, 13:40 14
Цитата Сообщение от Ksanteri Посмотреть сообщение
результут тот же - ничего.
У Вас file.txt сохранен в кодировке 1200 (UTF-16 LE), она не поддерживается в cmd
Сохраните файл в кодировке 1251 и всё заработает...
1
Ksanteri
0 / 0 / 0
Регистрация: 25.08.2016
Сообщений: 10
29.08.2016, 14:20  [ТС] 15
Цитата Сообщение от YuS_2 Посмотреть сообщение
file.txt сохранен в кодировке 1200 (UTF-16 LE)
Спасибо, действительно помогло!
Добавил Del newfile.txt в начале кода, чтобы на следующий день bat-файл создал бы новый newfile.txt, не добавляя события текущего дня к событиям вчерашнего.
Но можно ли пересохранить file.txt в кодировке 1251 также через bat-файл? Иначе получается, что вся работа по автоматизации процесса выборки строк идет на смарку.
Уточню, хотя очевидно это нужно было сделать в самом начале, что изначальный файл - file.txt получаю с контроллера, работающего как FTP-сервер. Контроллер сохраняет события построчно в файл LOGFILE.log. Кодировку сохранения на контроллере изменить не могу.
Есть ли возможность в bat-файле пересохранить LOGFILE.log в кодировке 1251?
0
YuS_2
Любознательный
1103 / 637 / 194
Регистрация: 10.03.2016
Сообщений: 1,481
29.08.2016, 16:47 16
Цитата Сообщение от Ksanteri Посмотреть сообщение
Но можно ли пересохранить file.txt в кодировке 1251 также через bat-файл?
Можно, но только с помощью дополнительных утилит. Например iconv, здесь можно почитать.
А автоматизировать... перед "chcp 1251>nul" добавить такую строку:
Windows Batch file
1
iconv -c -s -f UTF-16LE -t CP1251 file.txt>file-out.txt
- это iconv, который установлен у меня, а по ссылке немного другой win_iconv, в нем не поддерживается ключ "-s", просто уберите его из строки запуска...

и соответственно, далее в строке фильтра тоже изменить наименование входящего файла на "file-out.txt"
или вообще, передать по конвееру фильтру, без промежуточного файла... тут только от фантазии будет зависеть, что использовать

Добавлено через 1 час 27 минут
А, да, поспешил таки я с внешними утилитами и утверждениями о неподдержке
Умеет cmd конвертировать UTF-16, надо было в эту тему заглянуть, там всё есть для освежения памяти.
Вот такой код будет вполне работоспособным:
Windows Batch file
1
2
3
chcp 1251>nul
set oDate=%date:~3%
cmd /d /a /c type file.txt |findstr /brc:"%oDate:.=/%">>newfile.txt
1
Ksanteri
0 / 0 / 0
Регистрация: 25.08.2016
Сообщений: 10
30.08.2016, 08:06  [ТС] 17
Большое спасибо всем за ответы!
Задача выполнена!
Итоговый код выглядит так:

@echo off
type LOGFILE.log > LOGFILE.txt
chcp 1251>nul
set oDate=%date:~3%
cmd /d /a /c type LOGFILE.txt |findstr /brc:"%oDate:.=/%">todayevents.txt
chcp 866>nul
exit /b

Добавлено через 12 минут
Дополнительный вопрос-задача: можно ли не сохранять пустую выборку строк во второй txt-файл - не создавать его, если строк за текущий день не найдено?
0
YuS_2
Любознательный
1103 / 637 / 194
Регистрация: 10.03.2016
Сообщений: 1,481
30.08.2016, 12:10 18
Лучший ответ Сообщение было отмечено Ksanteri как решение

Решение

Цитата Сообщение от Ksanteri Посмотреть сообщение
можно ли не сохранять пустую выборку строк во второй txt-файл
Можно даже промежуточный файл не создавать:
Windows Batch file
1
2
3
4
5
6
7
@echo off
chcp 1251>nul
set oDate=%date:~3%
for /f "delims=" %%i in ('type LOGFILE.log ^|findstr /brc:"%oDate:.=/%"') do (
    echo %%i>>todayevents.txt
)
pause
1
Ksanteri
0 / 0 / 0
Регистрация: 25.08.2016
Сообщений: 10
30.08.2016, 12:27  [ТС] 19
Цитата Сообщение от YuS_2 Посмотреть сообщение
Можно даже промежуточный файл не создавать:
Мои познания здесь весьма примитивны)
Спасибо большое!
0
YuS_2
Любознательный
1103 / 637 / 194
Регистрация: 10.03.2016
Сообщений: 1,481
30.08.2016, 12:28 20
И при запуске, можно добавить проверку существования файла:
Windows Batch file
1
if exist todayevents.txt (del todayevents.txt)
А лучше наименование файла присвоить переменной и расставить её там, где используется в сценарии это наименование. Так будет правильнее.
0
30.08.2016, 12:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2016, 12:28

Как скопировать часть текста из строки в StringGrid
Добрый день! Мне нужно из одной колонки скопировать в каждой строке первые 8 символов и вставить в...

Задать имя файла, в который включена текущая дата
Доброго времени суток! Прошу извинить за банальный вопрос, но всеже ответа не нашел. Язык...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru