![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Время вставки строк. Нужна идея!
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 и т.д.