Форум: "Начинающим";
Текущий архив: 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)
> Я, наверное, как-то по другому понял.
Я кажется вспомнил его задачу. Он пишет нечто вроде лога температуры в теплице. Данные в файлах - градусы.
Смысла додумывать/интерполировать несуществуюющее ИМХО нет.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.061 c