Есть текстовый файл с данными. Со стороками такого вида 22.03.2005 17:35:18 0.300 100.000 100.000. Две первых переменных — дата и время. Необходимо прочитать эти данные для построения графика..
Как их считывать? Пробовал впрямую readln, но выдается ошибка. Если нет первых переменных дата и время, то нормально. Но хотелось бы график от врени или даты строить. Или как при чтении пропустить две первых переменных?
"dumand" <43723@users.rsdn.ru> wrote in message news:1375893@news.rsdn.ru... > Как их считывать? Пробовал впрямую readln, но выдается ошибка. Если нет первых переменных дата и время, то нормально. Но хотелось бы
Читаешь в строку и разбираешь. Если формат фиксированный — 1 и 2 символы это день, 4 и 5 месяц и т.п.
Здравствуйте, wellwell, Вы писали:
W>"dumand" <43723@users.rsdn.ru> wrote in message news:1375893@news.rsdn.ru... >> Как их считывать? Пробовал впрямую readln, но выдается ошибка. Если нет первых переменных дата и время, то нормально. Но хотелось бы
W>Читаешь в строку и разбираешь. Если формат фиксированный — 1 и 2 символы это день, 4 и 5 месяц и т.п.
Понимаю, что спрашиваю ерунду. Но я не программист. А надо поправить.Вот часть кода:
................
var
d1,d2,d4,d5,d7,d8,d9,d10,d11,d12,d14,d15,d17,d18:double;
d3,d6,d13,d16:string;
lbt,ldt,lbtd,ldtd,laoa,rbt,rdt,rbtd,rdtd,raoa,bbt,bdt,bbtd,bdtd,baoa:double;
lostr,lred,lgreen,ldis,rostr,rred,rgreen,rdis,bostr,bred,bgreen,bdis:double;
f:textfile;
............
begin
series1.Clear;
series2.Clear;
series3.Clear;
n:=0;
AssignFile(f,'Users\Eyes.txt');
Reset(f);
while not EOF(f) do
begin
n:=n+1;
readln(f);
read(f,d1);
read(f,d2);
read(f,d3);
read(f,d4);
read(f,d5);
read(f,d6);
read(f,d7);
read(f,d8);
read(f,d9);
read(f,d10);
read(f,d11);
read(f,d12);
read(f,d13);
read(f,d14);
read(f,d15);
read(f,d16);
read(f,d17);
read(f,d18);
readln(f,lostr,lred,lgreen,ldis,rostr,rred,rgreen,rdis,bostr,bred,bgreen,bdis);
series1.AddXY(n, rostr,'',clblue);
series2.AddXY(n, lostr,'',clgreen);
series3.AddXY(n, bostr,'',clred);
end;
CloseFile(f);
А вот что надо читать из файла:
Дата Время Левый глаз Баланс красный цвет Баланс зеленый цвет Баланс дистанция Правый глаз Баланс красный цвет Баланс зеленый цвет Баланс дистанция Оба глаза Баланс красный цвет Баланс зеленый цвет Баланс дистанция
22.03.2005 17:35:18 0.300 100.000 100.000 23.000 0.400 100.000 100.000 34.000 0.450 100.000 100.000 36.000
25.03.2005 18:07:42 0.351 100.000 100.000 24.000 0.351 100.000 100.000 26.000 0.400 100.000 100.000 14.000
27.03.2005 22:59:21 0.351 100.000 100.000 1.000
Здравствуйте, wellwell, Вы писали:
W>"dumand" <43723@users.rsdn.ru> wrote in message news:1375893@news.rsdn.ru... >> Как их считывать? Пробовал впрямую readln, но выдается ошибка. Если нет первых переменных дата и время, то нормально. Но хотелось бы
W>Читаешь в строку и разбираешь. Если формат фиксированный — 1 и 2 символы это день, 4 и 5 месяц и т.п.
Во, правильно. А еще можно прикрутить Regexp здесь
Здравствуйте, dumand, Вы писали:
D>Здравствуйте, wellwell, Вы писали:
W>>"dumand" <43723@users.rsdn.ru> wrote in message news:1375893@news.rsdn.ru... >>> Как их считывать? Пробовал впрямую readln, но выдается ошибка. Если нет первых переменных дата и время, то нормально. Но хотелось бы
W>>Читаешь в строку и разбираешь. Если формат фиксированный — 1 и 2 символы это день, 4 и 5 месяц и т.п.
D>Понимаю, что спрашиваю ерунду. Но я не программист. А надо поправить.Вот часть кода:
ужас, немного красивее ИМХО
unit PsEvnLog;
interface
uses Dialogs;
type
TEvnStruc = record
DateS : array [0..10] of char;
TimeS : array [0..10] of char;
TypeS : array [0..1] of char;
ChannelS : array [0..31] of char;
ObjectS : array [0..20] of char;
MessageS : array [0..47] of char;
OfferS : array [0..29] of char;
CrLfS : array [0..1] of char;
end;
type
TEnvTypeFile = file of TEvnStruc;
var
EvnFile : TEnvTypeFile;
S : TEvnStruc;
function FirstReadFileEvn: Boolean;
function NextReadFileEvn: Boolean;
procedure CloseAll;
implementation
function FirstReadFileEvn: Boolean;
var
ForResultread: integer;
begin
Result := True;
assignfile(EvnFile, 'C:\otchet\ОтчетТревог\RTM_1\trevogi.evn');
reset(EvnFile);
BlockRead(EvnFile, s, 1, ForResultread);
if ForResultread = 1 then
begin
showmessage(S.DateS);
showmessage(S.TimeS);
showmessage(s.TypeS);
showmessage(s.ChannelS);
showmessage(s.ObjectS);
showmessage(s.MessageS);
showmessage(s.OfferS); end else
begin
Result := False;
end;
end;
function NextReadFileEvn: Boolean;
var
ForResultread: integer;
begin
Result := True;
BlockRead(EvnFile, s, 1, ForResultread);
if ForResultread = 1 then
begin
showmessage(S.DateS);
showmessage(S.TimeS);
showmessage(s.TypeS);
showmessage(s.ChannelS);
showmessage(s.ObjectS);
showmessage(s.MessageS);
showmessage(s.OfferS); end else
begin
Result := False;
end;
end;
procedure CloseAll;
begin
CloseFile(EvnFile);
end;
end.
читаем
07.09.2005 13:49:13.0 W Пила#1 TC5 Число меньше еденицы 00000002.
07.09.2005 13:49:13.0 - Треугольник#2 TC5 Подстанции больше нетПодстанции больше нет 00000003.
07.09.2005 13:49:14.5 Пила#1 TC5 NORMAgjsdbhdjs 00000004.
Модуль как раз разрабатывается, не пинать сильно
... << RSDN@Home 1.2.0 alpha rev. 614>>
играет: судя по всему, умер
Здравствуйте, dumand, Вы писали:
D> В результате консультаций получился код. Но выдает ошибку причтении из файла "Invalid numeric input". Помогите разобраться.
Во-первых, есть гарантии того, что формат файла строгий и заданы все 13 значений?
Во-вторых, ты дебаггером смотрел, правильно работает твой алгоритм "парсинга" строки?
Только после этого можно будет что-то сказать.
И вообще все таки я в таких случаях использую регулярные выражения. Ссылку на компонент тебе дали, там даже есть русская справка.
Судя по тому что ты приводил:
рег. выр. будет таким
1) Сначала выдираем дату — ([0-9]{2}\.[0-9]{2}\.[0-9]{4})
2) Потом время — ([0-9]{2}\.[0-9]{2}\.[0-9]{4})
3) Значения — ([0-9]+\.[0-9]+)
4) Потом нужно учесть пробелы между всеми значениями — [^0-9]+
Теперь собираем в один expression:
1)4)2)4) и потом 11 раз 4)3)
procedure explode(const S, Delimeter : string; Parts : TStrings);
var
CurPos: integer;
CurStr: string;
begin
Parts.clear;
Parts.BeginUpdate();
try
CurStr:= S;
repeat
CurPos:= Pos(Delimeter, CurStr);
if (CurPos>0) then
begin
Parts.Add(Copy(CurStr, 1, Pred(CurPos)));
CurStr:= Copy(CurStr, CurPos+Length(Delimeter),
Length(CurStr)-CurPos-Length(Delimeter)+1);
end else
Parts.Add(CurStr);
until CurPos=0;
finally
Parts.EndUpdate();
end;
end;
pocedure getdata ( file_name : AnsiString);
var tmp_list,tmp_pars: TStringList;
count : integer;
s1 : String;
begin
tmp_list := TStringList.create;
tmp_list.LoadFromFile(file_name);
for count:=0 to tmp_list-1 do
begin
explode(tmp_list.string[count],' ',tmp_pars); // так как разделитель пробел, его и юзаем
s1 := tmp_pars.string[0]; // вот это и будут твои элементы
s2 := tmp_pars.string[1];
....
....
end;
tmp_list:=nli;
end;