Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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)
> Я, наверное, как-то по другому понял.

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


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


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

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


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

Я перелопачиваю 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:56) [43]

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


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


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


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

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


 
Jeer ©   (2010-03-24 17:02) [45]


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


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


 
Jeer ©   (2010-03-24 17:04) [46]


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


Поправка:

Copy(s, 1, m-1)


 
Sergey13 ©   (2010-03-24 17:05) [47]

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

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


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

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

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

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


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

P.S.

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


 
MsGuns ©   (2010-03-24 19:30) [50]

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


 
Jeer ©   (2010-03-24 19:38) [51]


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


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


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


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


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

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


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


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

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


 
Jeer ©   (2010-03-25 19:29) [54]

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

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



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

Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.61 MB
Время: 0.063 c
4-1238744433
SunSh@dow
2009-04-03 11:40
2010.08.27
выключить монитор


2-1268309018
Вася
2010-03-11 15:03
2010.08.27
Изображение на канве


15-1272135270
Alik
2010-04-24 22:54
2010.08.27
Первод кода с++ в Delphi


15-1266528605
Юрий
2010-02-19 00:30
2010.08.27
С днем рождения ! 19 февраля 2010 пятница


2-1272741834
Б
2010-05-01 23:23
2010.08.27
Инициализация массива.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский