Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

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

 
oleg1963lora   (2010-03-24 11:38) [0]

Здравствуйте Мастера!
Опять я к Вам со  своими огурцами! Имеются 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-минутной выборки??? Ничего другого пока в голову не идет...


 
oldman ©   (2010-03-24 11:43) [1]


> 2. Взять строки у которых Время по модулю 12 равно нулю
> (т.е. значения измерений через 12 мин.) и залить их в соответствующую
> ADO-табличку.
> Вот со вторым вопросом огромная ЗАСАДА. Как видно из таблички
> ни 18 ни 31 минута по модулю не ноль. Где их взять? Добавить.
>  Вставляю 19,20,21 и т.д пока не больше 31.


Странная задача...
Если надо взять только строки с модулем 12, зачем добавлять лишние?
Надо просто 18 и 31 игнорировать.


 
oldman ©   (2010-03-24 11:45) [2]

А если и добавлять, то только 00, 12, 24, 36, 48


 
Anatoly Podgoretsky ©   (2010-03-24 11:46) [3]

> oleg1963lora  (24.03.2010 11:38:00)  [0]

Что же ты такое написал, что время достигает 12 секунд, это же очень постараться нужно


 
Anatoly Podgoretsky ©   (2010-03-24 11:48) [4]

> oldman  (24.03.2010 11:43:01)  [1]

Надо время умножить на 120 и взять с нулевой частью


 
Jeer ©   (2010-03-24 11:53) [5]


> Может у Вас будут какие идеи насчет 12-минутной выборки?
> ??


Интерполяция ( хоть линейная или сложнее ) между двумя отсчетами не кратными 12.
Это при условии "гладкости" поведения значений функции.


 
Sha ©   (2010-03-24 11:54) [6]

> Может у Вас будут какие идеи

Есть одна.
Потратить 5 минут на нормальную формулировку задачи.


 
Jeer ©   (2010-03-24 11:55) [7]

P.S.
А скорее всего и как всегда - неверная постановка задачи.


 
sniknik ©   (2010-03-24 12:28) [8]

вся "задача" решается в 1 запрос
INSERT INTO xxx SELECT DISTINCT * FROM [Текстовый документ#txt]
WHERE (Minute(Время) mod 12) = 0

правда будут "огромные ЗАСАДЫ", т.к. неизвестен движок, и другие "подробности" наверняка всплывут.


 
oleg1963lora   (2010-03-24 12:29) [9]


> Надо время умножить на 120 и взять с нулевой частью

Поподробнее пожалуйста Анатолий

> А скорее всего и как всегда - неверная постановка задачи.

По моему вы очень близки к сути! Такой бред и сформулировать трудно.
Пожалуста посмотрите реальные файлы на
http://narod.ru/disk/19054457000/23-03-2010.ZIP.html


 
oleg1963lora   (2010-03-24 12:37) [10]


> Если надо взять только строки с модулем 12, зачем добавлять
> лишние?
> Надо просто 18 и 31 игнорировать.

А заодно

while not (Time mod 12) do
                                  ADOTable.Delete;

Может пара-тройка строк и выживет :)
А не выживет - сотру программу!


 
oldman ©   (2010-03-24 12:49) [11]


> Нужна идея!


А не выживет - сотру программу!

Классная идея!!!
:)


 
Jeer ©   (2010-03-24 13:03) [12]


> Пожалуста посмотрите реальные файлы на


Зачем ?
Файл не заменяет постановку задачи.
Вот у Вас при одном и том же времени существенно разные значения.
И на каком основании и что оставлять ?

Задачу огласите.


 
oleg1963lora   (2010-03-24 13:45) [13]


> Вот у Вас при одном и том же времени существенно разные
> значения.
> И на каком основании и что оставлять ?

Не совсем так. Если этот файл открыть в ехеле (расширение csv-UniCod), то видно время в формате ЧЧ:мм. Однако в строке редактирования видно время в формате чч:мм:сс (измерение происходит по прерыванию прибора. Поэтому в некоторых файлах результат регистрируется через секунду, а в каком-то из этих фалов видел измерение в 8:31 и 15:00). После преобразования текста в ASCII я разбираю строки, удаляю секунды и заливаю их в TStrinList.

Есть идея. Если разрыв времени больше 12 минут, то для 180-минутного разрыва добавить не 180  записей, а (60 мод 12)*3 часа=15 записей.
Буду действовать так. Спасибо за помощь.


 
oldman ©   (2010-03-24 13:53) [14]


> Поэтому в некоторых файлах результат регистрируется через
> секунду, а в каком-то из этих фалов видел измерение в 8:
> 31 и 15:00).

> Есть идея. Если разрыв времени больше 12 минут, то для 180-
> минутного разрыва добавить не 180  записей, а (60 мод 12)*3
> часа=15 записей.


А результаты измерений для добавляемых записей брать с потолка?


 
oldman ©   (2010-03-24 13:55) [15]


> Взять строки у которых Время по модулю 12 равно нулю (т.
> е. значения измерений через 12 мин.) и залить их в соответствующую
> ADO-табличку.


А зачем добавлять строки в файл, если можно добавлять сразу в таблицу?


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


> А результаты измерений для добавляемых записей брать с потолка?

Нет. Учитывая, что изменения климата вещь медленноизменяющаяся, можно взять средне-арифметическое значение параметра. Влажность заметно меняется минимум за 2 часа. Температура тоже. Хотя я видел здесь значение -243,90574 градуса :). Но это промах измерения (говорю как бывший метролог)

> А зачем добавлять строки в файл, если можно добавлять сразу
> в таблицу?

Если у меня в оперативке вставка строк идет 12 сек, прикинь скока это будет добавляться в таблицу.


 
brother ©   (2010-03-24 14:16) [17]

> Если у меня в оперативке вставка строк идет 12 сек, прикинь
> скока это будет добавляться в таблицу.

что то странное ты говоришь...


 
oleg1963lora   (2010-03-24 14:18) [18]

Кроме того, если взглянешь на файлы, увидишь много интересного.
Дата отделена от времени пробелом, а значение от времени - табуляцией(#9), файл может начинаться пустой строкой, а может и нет, значение может занимать 8 позиций после запятой, а может 3. Каждый файл в начале имеет значение "Время" и "Зачение"(это поля у него так называются), значит эту строку тоже надо обходить.
Это только те закономерности которые я выявил, а на что-то еще просто не нарвался. Видит Бог, взрывы на Солнце предсказывать куда как проще...


 
oldman ©   (2010-03-24 14:23) [19]


> Дата отделена от времени пробелом, а значение от времени
> - табуляцией(#9), файл может начинаться пустой строкой,
> а может и нет, значение может занимать 8 позиций после запятой,
>  а может 3. Каждый файл в начале имеет значение "Время"
> и "Зачение"(это поля у него так называются), значит эту
> строку тоже надо обходить.


И в чем проблема?


 
имя   (2010-03-24 14:25) [20]

Удалено модератором


 
Jeer ©   (2010-03-24 14:28) [21]


> Дата отделена от времени пробелом, а значение от времени
> - табуляцией(#9), файл может начинаться пустой строкой,
> а может и нет, значение может занимать 8 позиций после запятой,
>  а может 3


1. Не вижу никаких проблем распарсить данный формат.

2. Если Вам необходимо получение  значений в заданные моменты времени ( с периодом 12 сек ) не совпадающие, в общем случае, с табличным временем, то сам бог велел делать интерполяцию.


 
oleg1963lora   (2010-03-24 14:31) [22]


> И в чем проблема?

Проблема в том, что при обнаружении какого-либо новшества пытаюсь обойти его оператором If-then, но после одного-другого приходится заново продумывать алгоритм процедуры и писать по новой. До следующего новшества. И данный пост можно читать в цикле. Условие выхода-обрыв питания компа :)


 
oldman ©   (2010-03-24 14:33) [23]


> oleg1963lora   (24.03.10 14:25) [20]


Не вижу ни одной засады.
Каждая строка имеет формат
"дата пробел время табуляция значение конецстроки"


 
oldman ©   (2010-03-24 14:35) [24]


> oleg1963lora   (24.03.10 14:31) [22]
> Проблема в том, что при обнаружении какого-либо новшества
> пытаюсь обойти его оператором If-then


До написания алгоритма желательно продумать ВСЕ возможные варианты строк.
А то будешь переделывать до морковкиного заговения.


 
Jeer ©   (2010-03-24 14:36) [25]

Удалено модератором


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


> 1. Не вижу никаких проблем распарсить данный формат.

И я не вижу. Накидал тут процедурку, которая не рапарсивает строки, а РАСПАРИВАЕТ (как в бане)

procedure ParString(ParS : string; ParCode : char;Var List : TStringList);
var
   MyList1 : TStringList;
   MyList2 : TStringList;
   MyString : string;
   F           : text;

var BufS : string;
   i    : integer;
begin
   while Pos(ParCode,ParS)<>0  do
     begin
       i:=Pos(ParCode,ParS);
       if i >0  then
          begin
            BufS:=Copy(ParS,1,i-1);
            List.Add(BufS);
            Delete(ParS,1,i);
          end;
     end;
   List.Add(ParS);
end;

//Вызов
   MyString:="Мама мыла раму и грязные стекла";
   MyList1:=TStringList.Create;
   ParString(MyString,"и",MyList1);

//    MyList[0]="Мама мыла раму "
//    MyList[1]=" грязные стекла"
     MyList1:=Free;
//Вот собственно и все. Задав в качестве делимитера пробел, получишь
//список слов



 
Sergey13 ©   (2010-03-24 15:21) [27]

> [26] oleg1963lora   (24.03.10 14:49)

А какая у тебя СУБД?
Если ФБ/ИБ, то может попробовать присовокупить твой файл к базе как внешнюю таблицу и залить из нее сразу одним запросом в постоянную.


 
Jeer ©   (2010-03-24 15:33) [28]


> Sergey13 ©   (24.03.10 15:21) [27]


Ему нужен препроцессор перед заливкой.


 
oleg1963lora   (2010-03-24 15:41) [29]


> А какая у тебя СУБД?

Microsoft.Jet.OLEDB.4.0 если я правильно понял вопрос.
Совокуплять эти файлы я не хочу, хай сами совокупляются.
Эти же файлы - бабочки однодневки,они каждые сутки разные (одни имена файлов чего стоят: tmp971.csv-tmp978.csv), их надо разобрать, залить в базы и удалить. Создать запрос к этим таблицам, предоставить их пользователю, по желанию пользователя сохранить в архиве, в конце месяца подготовить отчет в бумажном и электронном формате, и удалить уже таблицы из БД. Вернуться в начало данного абзаца
Опять же в группе каждый файл хоть немного, но отличается от других. Посмотри сам.


 
Sergey13 ©   (2010-03-24 15:41) [30]

> [28] Jeer ©   (24.03.10 15:33)

В моем предложении препроцессор встроенный. 8-)


 
oleg1963lora   (2010-03-24 15:44) [31]


> Ему нужен препроцессор перед заливкой.

Именно Сергей! Чтобы не маяться еще и с ключами. И залить 120*8 записей, а не 1600*8!


 
oleg1963lora   (2010-03-24 15:45) [32]


> В моем предложении препроцессор встроенный. 8-)

Это на который шляпу одевают? :-))


 
Sergey13 ©   (2010-03-24 15:49) [33]

> [29] oleg1963lora   (24.03.10 15:41)
> Microsoft.Jet.OLEDB.4.0

Тогда чуть сложнее.
Создать таблицу контрольных точек, через 12 минут или через сколько надо. В каждой точке прописать время минимум и время максимум.
Заливать весь файл без разбора в БД в отдельную табличку. Далее из нее по соответствию контрольным точкам - одним запросом в рабочую таблицу. Ну и на последок транкейтнуть исходную освободив ее под следующий файл.
Как вариант.


 
oleg1963lora   (2010-03-24 16:04) [34]


> Создать таблицу контрольных точек, через 12 минут или через
> сколько надо.

А вот это уже интересно! Я сам сейчас этот вариант обдумываю, уже шестерни в голове срываются.
Берем первое время - 9:34
Берем второе время - 9:46
Надо ли между ними вставлять строку? 46-34=12, Только к модулю это никакого отношения не имеет(совпадение), и как из этого получить требуемое 9:36?
А если 9:34 и 9:37???

Тихо-тихо, чуть дыша, крыша едет неспеша


 
Sergey13 ©   (2010-03-24 16:17) [35]

> [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 и т.д.


 
Jeer ©   (2010-03-24 16:22) [36]


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


не-а

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


 
Jeer ©   (2010-03-24 16:26) [37]

Первая задача - загрузка 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 с )


 
Sergey13 ©   (2010-03-24 16:26) [38]

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

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


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


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


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

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

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


 
Sergey13 ©   (2010-03-24 16:42) [40]

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

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



Страницы: 1 2 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.296 c
6-1217926149
dima_tepl
2008-08-05 12:49
2010.08.27
Работа с микроконтроллером по TCP/IP протоколу


2-1267110427
dkhristich
2010-02-25 18:07
2010.08.27
Как корректно прекратить поток?


15-1264800605
Юрий
2010-01-30 00:30
2010.08.27
С днем рождения ! 30 января 2010 суббота


6-1222988045
sanchopansa
2008-10-03 02:54
2010.08.27
многопоточность при отправке письем через IdSmtp


15-1266571665
ANB
2010-02-19 12:27
2010.08.27
Госдума отказалась включать транспортный налог в стоимость топлив