Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2021, 19:44   #1
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 179
Восклицание сравнить конечное время каждой строки с начальным временем следующей строки и если разница меньше минуты, то объединить две сравниваемые строки в одну

Добрый вечер!

Есть массив строк (TArray<string>), содержащий некие промежутки времени в виде НАЧАЛЬНОЕ_ВРЕМЯ-КОНЕЧНОЕ_ВРЕМЯ в порядке возрастания.

Нужно сравнить конечное время каждой строки с начальным временем следующей строки и если разница меньше минуты, то объединить две сравниваемые строки в одну взяв начальное время первой строки и конечное время второй строки.

То есть из такого массива:

Цитата:
10:27:19.538-10:27:28.608
10:28:37.211-10:28:42.243
10:30:13.993-10:30:26.087
10:35:51.992-10:35:56.024
10:36:10.151-10:36:13.193
10:36:15.223-10:36:18.235
10:38:47.592-10:38:59.705
10:39:18.859-10:39:21.940
10:45:45.293-10:45:46.309
Должен получиться такой:

Цитата:
10:27:19.538-10:27:28.608
10:28:37.211-10:28:42.243
10:30:13.993-10:30:26.087
10:35:51.992-10:36:18.235
10:38:47.592-10:39:21.940
10:45:45.293-10:45:46.309

Помогите в кодом пожалуйста, что-то не могу сообразить как это реализовать средствами Delphi, запутался

Последний раз редактировалось garuna; 01.08.2021 в 12:10.
garuna вне форума Ответить с цитированием
Старый 31.07.2021, 20:58   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,465
По умолчанию

Примерно так (не запускал):
Код:
t1 := StrToTime(Copy(strs[0], 1, 12));
t2 := StrToTime(Copy(strs[0], 14, 12));
actual_size := 0;
for i := 1 to High(strs) do
begin
    t3 := StrToTime(Copy(strs[i], 1, 12));
    t4 := StrToTime(Copy(strs[i], 14, 12));
    if MilliSecondsBetween(t2, t3) < 60000 then
        t2 := t4
    else begin
        strs[actual_size] := FormatDateTime('hh:nn:ss.zzz', t1) + '-' + FormatDateTime('hh:nn:ss.zzz', t2);
        Inc(actual_size);
        t1 := t3;
        t2 := t4;
    end;
strs[actual_size] := FormatDateTime('hh:nn:ss.zzz', t1) + '-' + FormatDateTime('hh:nn:ss.zzz', t2);
Inc(actual_size);
SetLength(strs, actual_size);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 01.08.2021, 11:25   #3
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 179
По умолчанию

BDA, неа, что-то не работает
Изображения
Тип файла: png 21.png (32.6 Кб, 15 просмотров)
garuna вне форума Ответить с цитированием
Старый 01.08.2021, 12:03   #4
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 179
По умолчанию

В общем подумал сегодня на свежую голову и набросал такой код:

Код:

 var ATimeList:= TStringList.Create;
 ATimeList.LoadFromFile('C:\timelist.txt');
 ATimeList.Delimiter:= ';';
 ATimeList.DelimitedText:= ATimeList.Text;

 for var i:= Pred(ATimeList.Count) downto 1 do
 begin

  var FTimeStartCurrent:= Date + StrToTime(Copy(ATimeList[i], 1, 12));
  var FTimeEndCurrent:= Date + StrToTime(Copy(ATimeList[i], 14, 12));

  var FTimeStartNext:= Date + StrToTime(Copy(ATimeList[i - 1], 1, 12));
  var FTimeEndNext:=  Date + StrToTime(Copy(ATimeList[i - 1], 14, 12));

  if SecondsBetween(FTimeStartCurrent, FTimeEndNext) < 60
  then
  begin
   ATimeList[i - 1]:= FormatDateTime('hh:nn:ss.zzz', FTimeStartNext) + '-' + FormatDateTime('hh:nn:ss.zzz', FTimeEndCurrent);
   ATimeList.Delete(i);
  end;

 end;

 mmo1.Text:= ATimeList.Text;

Вроде работает. Всем спасибо.
garuna вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из строки удалить среднюю букву, если длина строки нечетная, если четная удалить две средние буквы. Заменить все вхождения в текст некоторой буквы на другую букву(PascalABCNET) FlayGlam Помощь студентам 0 03.12.2016 09:57
Сделать слияние двух строк в одну, если конец первой строки и начало второй строки совпадают JustDo1t C# (си шарп) 2 17.12.2015 20:17
Выводить только измененные строки. Перед каждой строкой записывать номер строки в исходном тексте.используя строки и текст.файл nero4ka C++ Builder 1 13.06.2015 07:14
Задача на строки. Даны две строки. Определить можно ли из символов первой строки получить вторую строку.( написать подпрограммой и ANTON1994 Паскаль, Turbo Pascal, PascalABC.NET 5 09.02.2013 13:07
сравнить две строки maxs7 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 01.10.2010 04:27

Реклама для незарегистрированных, регистрация на форуме