![]() |
| ||
|
|
Новости |
Поиск |
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-минутной выборки??? Ничего другого пока в голову не идет...
oleg1963lora (2010-03-24 16:04:00) [21]
> Создать таблицу контрольных точек, через 12 минут или через
> сколько надо.
А вот это уже интересно! Я сам сейчас этот вариант обдумываю, уже шестерни в голове срываются.
Берем первое время - 9:34
Берем второе время - 9:46
Надо ли между ними вставлять строку? 46-34=12, Только к модулю это никакого отношения не имеет(совпадение), и как из этого получить требуемое 9:36?
А если 9:34 и 9:37???
Тихо-тихо, чуть дыша, крыша едет неспеша
Sergey13 (2010-03-24 15:49:00) [22]> [29] oleg1963lora (24.03.10 15:41)
> Microsoft.Jet.OLEDB.4.0
Тогда чуть сложнее.
Создать таблицу контрольных точек, через 12 минут или через сколько надо. В каждой точке прописать время минимум и время максимум.
Заливать весь файл без разбора в БД в отдельную табличку. Далее из нее по соответствию контрольным точкам - одним запросом в рабочую таблицу. Ну и на последок транкейтнуть исходную освободив ее под следующий файл.
Как вариант.
oleg1963lora (2010-03-24 15:45:00) [23]
> В моем предложении препроцессор встроенный. 8-)
Это на который шляпу одевают? :-))
oleg1963lora (2010-03-24 15:44:00) [24]
> Ему нужен препроцессор перед заливкой.
Именно Сергей! Чтобы не маяться еще и с ключами. И залить 120*8 записей, а не 1600*8!
Sergey13 (2010-03-24 15:41:00) [25]> [28] Jeer © (24.03.10 15:33)
В моем предложении препроцессор встроенный. 8-)
oleg1963lora (2010-03-24 15:41:00) [26]
> А какая у тебя СУБД?
Microsoft.Jet.OLEDB.4.0 если я правильно понял вопрос.
Совокуплять эти файлы я не хочу, хай сами совокупляются.
Эти же файлы - бабочки однодневки,они каждые сутки разные (одни имена файлов чего стоят: tmp971.csv-tmp978.csv), их надо разобрать, залить в базы и удалить. Создать запрос к этим таблицам, предоставить их пользователю, по желанию пользователя сохранить в архиве, в конце месяца подготовить отчет в бумажном и электронном формате, и удалить уже таблицы из БД. Вернуться в начало данного абзаца
Опять же в группе каждый файл хоть немного, но отличается от других. Посмотри сам.
Jeer (2010-03-24 15:33:00) [27]
> Sergey13 © (24.03.10 15:21) [27]
Ему нужен препроцессор перед заливкой.
Sergey13 (2010-03-24 15:21:00) [28]> [26] oleg1963lora (24.03.10 14:49)
А какая у тебя СУБД?
Если ФБ/ИБ, то может попробовать присовокупить твой файл к базе как внешнюю таблицу и залить из нее сразу одним запросом в постоянную.
oleg1963lora (2010-03-24 14:49:00) [29]
> 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;
//Вот собственно и все. Задав в качестве делимитера пробел, получишь
//список слов
Jeer (2010-03-24 14:36:00) [30]Удалено модератором
oldman (2010-03-24 14:35:00) [31]
> oleg1963lora (24.03.10 14:31) [22]
> Проблема в том, что при обнаружении какого-либо новшества
> пытаюсь обойти его оператором If-then
До написания алгоритма желательно продумать ВСЕ возможные варианты строк.
А то будешь переделывать до морковкиного заговения.
oldman (2010-03-24 14:33:00) [32]
> oleg1963lora (24.03.10 14:25) [20]
Не вижу ни одной засады.
Каждая строка имеет формат
"дата пробел время табуляция значение конецстроки"
oleg1963lora (2010-03-24 14:31:00) [33]
> И в чем проблема?
Проблема в том, что при обнаружении какого-либо новшества пытаюсь обойти его оператором If-then, но после одного-другого приходится заново продумывать алгоритм процедуры и писать по новой. До следующего новшества. И данный пост можно читать в цикле. Условие выхода-обрыв питания компа :)
Jeer (2010-03-24 14:28:00) [34]
> Дата отделена от времени пробелом, а значение от времени
> - табуляцией(#9), файл может начинаться пустой строкой,
> а может и нет, значение может занимать 8 позиций после запятой,
> а может 3
1. Не вижу никаких проблем распарсить данный формат.
2. Если Вам необходимо получение значений в заданные моменты времени ( с периодом 12 сек ) не совпадающие, в общем случае, с табличным временем, то сам бог велел делать интерполяцию.
(2010-03-24 14:25:00) [35]Удалено модератором
oldman (2010-03-24 14:23:00) [36]
> Дата отделена от времени пробелом, а значение от времени
> - табуляцией(#9), файл может начинаться пустой строкой,
> а может и нет, значение может занимать 8 позиций после запятой,
> а может 3. Каждый файл в начале имеет значение "Время"
> и "Зачение"(это поля у него так называются), значит эту
> строку тоже надо обходить.
И в чем проблема?
oleg1963lora (2010-03-24 14:18:00) [37]Кроме того, если взглянешь на файлы, увидишь много интересного.
Дата отделена от времени пробелом, а значение от времени - табуляцией(#9), файл может начинаться пустой строкой, а может и нет, значение может занимать 8 позиций после запятой, а может 3. Каждый файл в начале имеет значение "Время" и "Зачение"(это поля у него так называются), значит эту строку тоже надо обходить.
Это только те закономерности которые я выявил, а на что-то еще просто не нарвался. Видит Бог, взрывы на Солнце предсказывать куда как проще...
brother (2010-03-24 14:16:00) [38]> Если у меня в оперативке вставка строк идет 12 сек, прикинь
> скока это будет добавляться в таблицу.
что то странное ты говоришь...
oleg1963lora (2010-03-24 14:04:00) [39]
> А результаты измерений для добавляемых записей брать с потолка?
Нет. Учитывая, что изменения климата вещь медленноизменяющаяся, можно взять средне-арифметическое значение параметра. Влажность заметно меняется минимум за 2 часа. Температура тоже. Хотя я видел здесь значение -243,90574 градуса :). Но это промах измерения (говорю как бывший метролог)
> А зачем добавлять строки в файл, если можно добавлять сразу
> в таблицу?
Если у меня в оперативке вставка строк идет 12 сек, прикинь скока это будет добавляться в таблицу.
oldman (2010-03-24 13:55:00) [40]
> Взять строки у которых Время по модулю 12 равно нулю (т.
> е. значения измерений через 12 мин.) и залить их в соответствующую
> ADO-табличку.
А зачем добавлять строки в файл, если можно добавлять сразу в таблицу?