Что нового

Выборка строк из текстового файла по определённому промежутку даты и времени

biyas71250

Новичок
Сообщения
7
Репутация
0
Есть текстовый файл в котором данные типа:
04.04.2022 10:42:30 4559
04.04.2022 12:00:10 5655
06.04.2022 04:44:00 6656
06.04.2022 08:25:10 8441
07.04.2022 10:46:30 4584
07.04.2022 11:21:13 6466
07.04.2022 14:48:30 4444
09.04.2022 17:33:25 5449
04.05.2022 06:50:11 4482
04.05.2022 09:41:47 6546
05.05.2022 12:52:27 5645
Необходимо сделать выборку строк по дате и времени. Например с 07.04.2022 06:00:00 до 07.04.2022 17:00:00 или с 07.04.2022 06:00:00 до 09.04.2022 17:00:00. По одной паре данных, дата и время, проблем нет, а вот по промежутку ни как не получается. Может кто что может подсказать по данному вопросу?
 
Последнее редактирование:

Alecsis

Осваивающий
Сообщения
98
Репутация
41
Как теоретический вариант: 1) FileReadToArray в рабочий массив; 2) нормализовать (переформатировать) в нём значения даты/времени к ISO-подобному виду, например "YYYYMMDDhhmmss"; если нет уверенности, что исх. файл отсортирован, то вкатить массиву _ArraySort, ну а остальное уже — дело техники. Т.е. лобовой перебор массива со сравнением на «меньше начальной»/«больше конечной» нормализованной даты и вуаля… :acute:
Если интересны подробрости реализации, могу кинуть работающий вариант.
PS Исходный файл отсортирован? Если да, то всё ещё проще
 
Автор
B

biyas71250

Новичок
Сообщения
7
Репутация
0
Как теоретический вариант: 1) FileReadToArray в рабочий массив; 2) нормализовать (переформатировать) в нём значения даты/времени к ISO-подобному виду, например "YYYYMMDDhhmmss"; если нет уверенности, что исх. файл отсортирован, то вкатить массиву _ArraySort, ну а остальное уже — дело техники. Т.е. лобовой перебор массива со сравнением на «меньше начальной»/«больше конечной» нормализованной даты и вуаля… :acute:
Если интересны подробрости реализации, могу кинуть работающий вариант.
PS Исходный файл отсортирован? Если да, то всё ещё проще
Очень интересует подробности реализации. Я только недавно начал осваивать Autoit. На самом деле всё немного сложнее, на Raspberry Pi лежит файл в который записываются вышеуказанные данные. А мне нужно через SFTP вытащить файл и из этого файла выбрать строки только за определённое число и определённое время. За определённый день я смог вытащить данные. Я копирую файл в Temp папку и потом делаю выборку сторок за определённую дату а вот за промежуток даты или времени ни как не получается. Если можно помогите примером, на примере выше указанных данных. Я вообще ни где ни нашёл в примерах выборку данных по промежутку даты и времени. Мне наверное просто не повезло.
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
537
Репутация
65
Задача решается довольно просто если привести время в формат Unix time. Решение сведется к вхождению числа в указанный диапазон.
 
Автор
B

biyas71250

Новичок
Сообщения
7
Репутация
0
Задача решается довольно просто если привести время в формат Unix time. Решение сведется к вхождению числа в указанный диапазон.
Дата и время у меня уже приведены к формату 05.05.2022 12:52:27, как в исходном файле. Вся проблема в том, что мне нужно сделать выборку строк по дате и времени, допустим с 07.04.2022 14:32:44 до 07.04.2022 22:48:25 или с 07.04.2022 08:12:22 до 08.04.2022 15:11:01.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Дата и время у меня уже приведены к формату 05.05.2022 12:52:27, как в исходном файле.
Текст сравнивать хотите? Не получится. Нужно перевести дату/время в Unix формат, т. е. количество секунд с 1970 года.
Сравниваете числа (не строки) и производите выборку данных если число входит в заданный диапазон.
 
Автор
B

biyas71250

Новичок
Сообщения
7
Репутация
0
Текст сравнивать хотите? Не получится. Нужно перевести дату/время в Unix формат, т. е. количество секунд с 1970 года.
Сравниваете числа (не строки) и производите выборку данных если число входит в заданный диапазон.
А можно хоть какой то пример? Я шёл другим путём. У меня была переменная в которой был счёт посекундно (или если шаг больше, то поминутно и т.п.) и я в переменной имел допустим: 04.04.2022 10:42:30, потом 04.04.2022 10:42:31, потом 04.04.2022 10:42:32 и т.д. И так весь мой заданный диапазон времени. И я думал сравнивать каждое значение переменной со строками в файле и если есть совпадение, то записывать строку в отдельный файл. Так делать выборку нужных мне строк по диапазону даты и времени. Но беда в том, что у меня пока не хватает знаний, я только начал осваивать Autoit. Если можно такую задачу решить другим путём, я буду только рад любым примерам и помощи. Делать выборку допустим за один день, я делал, а вот от одой даты и времени до другой даты и времени я пока не понимаю как сделать.
 

Alecsis

Осваивающий
Сообщения
98
Репутация
41
А можно хоть какой то пример?
Можно. Вот-с, по-нашему, по-неучёному © :drinks: т.е. без извращений с Unix-форматом
Разумеется, подкрутить/подшабрить с учётом собственных целей.
Протокол запуска:
>"C:\DevTools\AutoIt3\SciTE\..\AutoIt3.exe"       /ErrorStdOut "D:\Alecsis\Prog\AutoIt\Forum\biyas-1.au3"     
Date/time:  07.04.2022 06:00:00 --> 07.04.2022 17:00:00,
Total item(s) found = 3:
- 07.04.2022 10:46:30 4584
- 07.04.2022 11:21:13 6466
- 07.04.2022 14:48:30 4444
>Exit code: 0    Time: 0.15
 

Вложения

  • biyas-1.au3
    4.8 КБ · Просмотры: 5
Автор
B

biyas71250

Новичок
Сообщения
7
Репутация
0
Можно. Вот-с, по-нашему, по-неучёному © :drinks: т.е. без извращений с Unix-форматом
Разумеется, подкрутить/подшабрить с учётом собственных целей.
Протокол запуска:
>"C:\DevTools\AutoIt3\SciTE\..\AutoIt3.exe"       /ErrorStdOut "D:\Alecsis\Prog\AutoIt\Forum\biyas-1.au3"    
Date/time:  07.04.2022 06:00:00 --> 07.04.2022 17:00:00,
Total item(s) found = 3:
- 07.04.2022 10:46:30 4584
- 07.04.2022 11:21:13 6466
- 07.04.2022 14:48:30 4444
>Exit code: 0    Time: 0.15
Моё огромное БЛАГОДАРЮ. Я посмотрю на выходные, потом отпишусь.
Сообщение автоматически объединено:

Был в отпуске, сейчас начал разбираться с примером. Всё вроде бы было бы изумительно, подогнал "под себя", если бы не одно "НО". Вот эта строка выбора времени "GUICtrlCreateDate('', 17, 56, 75, 20, $DTS_TIMEFORMAT)" на одном компьютере показывает допустим 08:35:21, а на другом 8:35:21, т.е. нет нуля, а соответственно на том компьютере где не показывает ноль, файл не стартует с нужного времени, а стартует с первой строки. Как бы можно было бы это победить?
 
Последнее редактирование:

Alecsis

Осваивающий
Сообщения
98
Репутация
41
[…] на одном компьютере показывает допустим 08:35:21, а на другом 8:35:21, т.е. нет нуля […] Как бы можно было бы это победить?
ответный вопрос: исзодный .txt выглядит примерно так же, только время без ведущего нуля?
Если да, то элементарно = допилить ф-цию u_Normalize(), могу кинуть вариант, к-рый вообще нечувствителен к наличию/отсутствю ведущих нулей.
 
Автор
B

biyas71250

Новичок
Сообщения
7
Репутация
0
В файле с нулями, но если можно вариант который не чувствителен к наличию/отсутствю ведущих нулей. При любом раскладе, даже и на будующее пригодиться.
 

Alecsis

Осваивающий
Сообщения
98
Репутация
41
В файле с нулями, но если можно вариант который не чувствителен к наличию/отсутствю ведущих нулей. При любом раскладе, даже и на будующее пригодиться.
Ok! Здесь с переделанной ф-цией нормализации + издевательством над исходными данными + логом запуска:acute:
И таки да, есть что ещё допилить в этой нормализации: вместо жёсткой привязки к формату день-месяц-год передавать скрипту параметр, задающий этот формат. Т.к. на разных компах м.б. разные настройки, например амеровский mm/dd/yyyy. На моём компе вообще yyyy-mm-dd…
 

Вложения

  • biyas-2.rar
    4 КБ · Просмотры: 6
Последнее редактирование:
Верх