Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Время вставки строк. Нужна идея!


Страницы:   1 2 3

oleg1963lora ©   (2010-03-24 11:38:00) 

Здравствуйте Мастера!
Опять я к Вам со  своими огурцами! Имеются txt-файл(ы) следующего
содержания:
   Время Значение
15.03.2010 8:18 32,98893738
15.03.2010 8:31 32,77963257
15.03.2010 8:31 29,89930534
15.03.2010 8:31 26,62034416
15.03.2010 8:31 23,75000381
15.03.2010 8:31 20,82294464
15.03.2010 8:31 18,2397995
15.03.2010 8:32 16,26139832
15.03.2010 8:35 33,5317688
15.03.2010 8:35 30,3993988
15.03.2010 8:36 27,1519928
15.03.2010 8:36 23,95251846

Нужно:
1. Удалить дубли Дата+Время (вопросов нет, все работает)
2. Взять строки у которых Время по модулю 12 равно нулю (т.е. значения измерений через 12 мин.) и залить их в соответствующую ADO-табличку.
Вот со вторым вопросом огромная ЗАСАДА. Как видно из таблички ни 18 ни 31 минута по модулю не ноль. Где их взять? Добавить. Вставляю 19,20,21 и т.д пока не больше 31.
При числе записей 24 часа*60 мин = 1440 записей время добавления строк достигает 12 секунд! А файлов 8 штук. 2 минуты на 3,2 ГГцовом камне. Про заливку в таблицу просто не говорю.
Может у Вас будут какие идеи насчет 12-минутной выборки??? Ничего другого пока в голову не идет...


Jeer   (2010-03-25 19:29:00) [1]

Похоже, уволили мужика...

Как там теперь без него: растения, птицы, яйца..


Плохиш   (2010-03-24 20:28:00) [2]


> MsGuns ©   (24.03.10 19:30) [50]
>
> Читал-читал, надорвавсь :)
> Резюм - нанять профессионального программиста.

Ему это в каждой его ветке советуют.


Jeer   (2010-03-24 20:13:00) [3]


> Данные по температуре пишуться до 13-й позиции после запятой.


Вот это меня крайне заинтересовало..
А не подскажешь, где найти преобразователь с таким разрешением ?

11 знаков после градуса..
Это ж после матерного слова в деревне за 1 км датчик будет фиксировать повышение температуры.


Jeer   (2010-03-24 19:38:00) [4]


> MsGuns ©   (24.03.10 19:30) [50]
>
> Читал-читал, надорвавсь :)
> Резюм - нанять профессионального программиста.


Да ладно тебе..
Сам-то уж ты не маленький и, наверняка, тоже были "убойные" времена.


MsGuns   (2010-03-24 19:30:00) [5]

Читал-читал, надорвавсь :)
Резюм - нанять профессионального программиста.


Jeer   (2010-03-24 17:12:00) [6]

P.S.

Мне все равно делать нечего - гриппую, вот и развлекаюсь :)


Jeer   (2010-03-24 17:11:00) [7]

Посмотрел я на его график - типичный колебательный процесс при авторегулировании.

http://s001.radikal.ru/i196/1003/13/26ef399633b9.jpg

Промежуточные значения легко вычисляются интерполяцией.


Sergey13   (2010-03-24 17:05:00) [8]

> [44] Jeer ©   (24.03.10 17:00)
> он сам сказал, что показатели меняются относительно медленно

Он же сам в прошлый раз так-же говорил что то про отключения отопления и разбитые стекла, если мне память не изменяет.


Jeer   (2010-03-24 17:04:00) [9]


> arDT[j] := StrToDateTime(Copy(s, 1, m - k - 1), fsLoc);


Поправка:

Copy(s, 1, m-1)


Jeer   (2010-03-24 17:02:00) [10]


> //это работает только в Delphi 2009, т.к. он понимает UniCode//


Не у всех Delphi с поддержкой UTF.


Jeer   (2010-03-24 17:00:00) [11]


> Смысла додумывать/интерполировать несуществуюющее ИМХО нет.


Еще как есть - он сам сказал, что показатели меняются относительно медленно, а значит - гладкость выдерживается.

Это я про метрологически правильную постановку.


oleg1963lora   (2010-03-24 16:56:00) [12]

На сегодня заканчиваю. У меня и-нет выключат с минуты на минуту.
Всем пока и удачи. Завтра вернусь.


oleg1963lora   (2010-03-24 16:54:00) [13]

Я перелопачиваю UTF в ASCII гораздо проще!

procedure ConvertUNICodeToASCII(Var FName : string);
//Конверт из Unicode в ASCII (обычный текстовик),
//-------------------------------------------------------------
//это работает только в Delphi 2009, т.к. он понимает UniCode//
//-------------------------------------------------------------
var StrList :  TStringList;
   i : integer;
begin
StrList:=TStringList.Create(); //Создадим список строк в памяти
StrList.LoadFromFile(FName,TEncoding.Unicode); //загрузим файл
                                                     //Unicode туды
i:=Pos('csv',FName);
Delete(FName,i,3);
FName:=Concat(FName,'tmp');
StrList.SaveToFile(FName,TEncoding.ASCII); //сохраним файл в формате ASCII
StrList.Free;  //освободим занимаемую память.
//End Конверта из Unicode в ASCII (В FName.tmp обычный текстовик)
end;

Про парсинг строк я уже говорил в [26].


oleg1963lora   (2010-03-24 16:49:00) [14]


> Какой-то софт пишет логи с дискретом в 1 сек и неравномерным
> интервалом между записями.

Такой же как и у тебя с мышью-если ее не трогать, курсор буде неподвижен вечно. Сдвинул - сработал обработчик. Данные по температуре пишуться до 13-й позиции после запятой. Пьяный электрик рядом выдохнул винное облако в пяти метрах от датчика, он сработал.
Друг мне говорит - надо электрика вы**ать!


Sergey13   (2010-03-24 16:42:00) [15]

> [39] Jeer ©   (24.03.10 16:31)
> Я, наверное, как-то по другому понял.

Я кажется вспомнил его задачу. Он пишет нечто вроде лога температуры в теплице. Данные в файлах - градусы.
Смысла додумывать/интерполировать несуществуюющее ИМХО нет.


Jeer   (2010-03-24 16:31:00) [16]


> Sergey13 ©   (24.03.10 16:26) [38]
>
> > [36] Jeer ©   (24.03.10 16:22)
>
> Ну так для всех исходных записей попадающих в одну контрольную
> точку взять одно среднее значение.
> <Цитат


Я, наверное, как-то по другому понял.

***
Какой-то софт пишет логи с дискретом в 1 сек и неравномерным интервалом между записями.
Задача сделать синтетический (расчетный) лог с дискретом в 1 сек и шагом в 12 сек.
***

Вот так должна была быть поставлена автором задача, ну и парсинг, есс-но.


Sergey13   (2010-03-24 16:26:00) [17]

> [36] Jeer ©   (24.03.10 16:22)

Ну так для всех исходных записей попадающих в одну контрольную точку взять одно среднее значение.


Jeer   (2010-03-24 16:26:00) [18]

Первая задача - загрузка UTF-файла и парсинг в два массива время-значение решается след образом. Желающие могут улучшать.

function UTF16_2_ANSI(const strFile: string): AnsiString;
var
 inBuf: PWideChar;
 hFile, fRead: Cardinal;
 fSize: DWORD;
begin
 Result := '';
 hFile := CreateFile(PChar(strFile), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 if hFile = INVALID_HANDLE_VALUE then Exit;
 inBuf := nil;
 try
   fSize := GetFileSize(hFile, nil);
   if fSize = 0 then Exit;
   GetMem(inBuf, fSize);
   if ReadFile(hFile, inBuf^, fSize, fRead, nil) and (Ord(inBuf^) = $FEFF) then
     Result := (WideCharLenToString(inBuf + 1, (fRead div 2) - 1));
 finally
   FreeMem(inBuf);
   CloseHandle(hFile);
 end;
end;

var i, j, k, m: integer;
 s, ss: string;
 fsLoc: TFormatSettings;
 arDT: array of TDateTime;
 arValues: array of double;
 lst: TStringList;

begin

 GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, fsLoc);

 with fsLoc do begin
   DecimalSeparator := ',';
   ShortDateFormat := 'DD.MM.YYYY';
   ShortTimeFormat := 'HH:NN:SS';
 end;

 lst := TStringList.Create;
 try
   lst.Text := UTF16_2_ANSI(OpenDialog.FileName);
   j := 0;
   SetLength(arDT, lst.Count);
   SetLength(arValues, lst.Count);
   for i := 0 to lst.Count - 1 do begin
     s := Trim(lst[i]);
     if (Length(s) > 19) then begin
       k := Pos(#32, s);
       m := Pos(#9, s);
       if (k > 0) and (m > 0) and (m > k) then begin
         arDT[j] := StrToDateTime(Copy(s, 1, m - k - 1), fsLoc);
         arValues[j] := StrToFloat(Copy(s, m + 1, Length(s) - m), fsLoc);
         Inc(j);
       end;
     end;
   end; // for
 finally
   lst.Free;
 end; // try

 SetLength(arDT, j - 1);
 SetLength(arValues, j - 1);

end;

В итоге имеем массивы времени и значений.
Следующая задачка - интерполяция неравномерно заданной табличной функции в функцию с постоянным шагом по времени ( 12 с )


Jeer   (2010-03-24 16:22:00) [19]


> Sergey13 ©   (24.03.10 15:41) [30]
>
> > [28] Jeer ©   (24.03.10 15:33)
>
> В моем предложении препроцессор встроенный. 8-)


не-а

Ему нужно обязательно делать интерполяцию, иначе никакая это не метрологически обоснованная информация.


Sergey13   (2010-03-24 16:17:00) [20]

> [34] oleg1963lora   (24.03.10 16:04)
> получить требуемое 9:36?

Кем требуемое то?
Таблица контрольных точек
Номер T-min  T-max
1      0:00   0:12
2      0:13   0:24
3      0:25   0:36
...
120   23:48  24:00

Время в файле 00:07 - автоматом попадает в первую точку поскольку 0:00<=00:07<=0:12 и т.д.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо