Чтение данных из текстового файла.
От: dumand  
Дата: 10.09.05 21:24
Оценка:
Есть текстовый файл с данными. Со стороками такого вида 22.03.2005 17:35:18 0.300 100.000 100.000. Две первых переменных — дата и время. Необходимо прочитать эти данные для построения графика..
Как их считывать? Пробовал впрямую readln, но выдается ошибка. Если нет первых переменных дата и время, то нормально. Но хотелось бы график от врени или даты строить. Или как при чтении пропустить две первых переменных?
Re: Чтение данных из текстового файла.
От: wellwell Австралия https://www.softperfect.com
Дата: 10.09.05 22:28
Оценка:
"dumand" <43723@users.rsdn.ru> wrote in message news:1375893@news.rsdn.ru...
> Как их считывать? Пробовал впрямую readln, но выдается ошибка. Если нет первых переменных дата и время, то нормально. Но хотелось бы

Читаешь в строку и разбираешь. Если формат фиксированный — 1 и 2 символы это день, 4 и 5 месяц и т.п.
Posted via RSDN NNTP Server 1.9
Re[2]: Чтение данных из текстового файла.
От: dumand  
Дата: 11.09.05 11:43
Оценка:
Здравствуйте, 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
Re[2]: Чтение данных из текстового файла.
От: Andy BiiiG Россия  
Дата: 11.09.05 12:02
Оценка: +1
Здравствуйте, wellwell, Вы писали:

W>"dumand" <43723@users.rsdn.ru> wrote in message news:1375893@news.rsdn.ru...

>> Как их считывать? Пробовал впрямую readln, но выдается ошибка. Если нет первых переменных дата и время, то нормально. Но хотелось бы

W>Читаешь в строку и разбираешь. Если формат фиксированный — 1 и 2 символы это день, 4 и 5 месяц и т.п.


Во, правильно. А еще можно прикрутить Regexp здесь
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Чтение данных из текстового файла.
От: ironwit Украина  
Дата: 11.09.05 12:25
Оценка:
Здравствуйте, 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>>
играет: судя по всему, умер
Я не умею быть злым, и не хочу быть добрым.
Re[3]: Чтение данных из текстового файла.
От: BeeNokle Россия  
Дата: 12.09.05 08:21
Оценка:
Здравствуйте, Andy BiiiG, Вы писали:

AB>Во, правильно. А еще можно прикрутить Regexp здесь


Очень даже трезвая мысль! И не надо никаких заморочек..
Разработка и продвижение сайтов http://www.inform-s.ru/
Разработка и продвижение сайтов:
<a href="http://www.inform-s.ru/">http://www.inform-s.ru/&lt;/a&gt;
Re[4]: Чтение данных из текстового файла.
От: dumand  
Дата: 13.09.05 18:10
Оценка:
В результате консультаций получился код. Но выдает ошибку причтении из файла "Invalid numeric input". Помогите разобраться.


unit Unit_111; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls, Buttons, ExtCtrls, TeeProcs, TeEngine, Chart, Series; 
 
type 
  TForm1 = class(TForm) 
    Chart1: TChart; 
    BitBtn1: TBitBtn; 
    Series1: TLineSeries; 
    Series2: TLineSeries; 
    Series3: TLineSeries; 
 
    procedure Button1Click(Sender: TObject); 
//    procedure FormCreate(Sender: TObject); 
  private 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 
 
var 
 
  Form1: TForm1; 
 
  S,S1 : string; 
  f : TextFile; 
  i : integer; 
  ArVar : array[0..13] of real; 
  dtDate, dtTime : TDateTime; 
 
 
 
//  n:double; 
 
  n,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; 
 
 
implementation 
 
{$R *.dfm} 
procedure TForm1.Button1Click(Sender: TObject); 
 
begin 
DecimalSeparator := '.'; 
//TimeSeparator := ':'; 
//DateSeparator := '.'; 
 
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);  
    readln(f,S); 
     for i:=0 to 13 do begin 
      if i <> 13 
        then S1 := Copy(S,1,Pos(#9,S)-1) 
        else S1 := S; 
      case i of 
        0 : dtDate := StrToDate(S1); 
        1 : dtTime := StrToTime(S1); 
        else  ArVar[i] := StrToFloat(S1); 
      end; 
      Delete(S,1,Pos(#9,S)); 
    end; 
    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); 
 
  end; 
end.
Re[5]: Чтение данных из текстового файла.
От: BeeNokle Россия  
Дата: 15.09.05 09:07
Оценка:
Здравствуйте, dumand, Вы писали:

D> В результате консультаций получился код. Но выдает ошибку причтении из файла "Invalid numeric input". Помогите разобраться.


Во-первых, есть гарантии того, что формат файла строгий и заданы все 13 значений?
Во-вторых, ты дебаггером смотрел, правильно работает твой алгоритм "парсинга" строки?

Только после этого можно будет что-то сказать.

И вообще все таки я в таких случаях использую регулярные выражения. Ссылку на компонент тебе дали, там даже есть русская справка.
Судя по тому что ты приводил:

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


рег. выр. будет таким
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)

([0-9]{2}\.[0-9]{2}\.[0-9]{4})[^0-9]+([0-9]{2}\.[0-9]{2}\.[0-9]{4})[^0-9]+([0-9]+\.[0-9]+)....

Разработка и продвижение сайтов http://www.inform-s.ru/
Разработка и продвижение сайтов:
<a href="http://www.inform-s.ru/">http://www.inform-s.ru/&lt;/a&gt;
Re[5]: Чтение данных из текстового файла.
От: BeeNokle Россия  
Дата: 15.09.05 09:11
Оценка:
Здравствуйте, dumand, Вы писали:

Прошу прощения — 14 значений...
И потом вместо [0-9] можно писать \d
Вместо [^0-9] можно писать \D

Просто лично мне так удобней и видно сразу что требуеться.
Разработка и продвижение сайтов http://www.inform-s.ru/
Разработка и продвижение сайтов:
<a href="http://www.inform-s.ru/">http://www.inform-s.ru/&lt;/a&gt;
Re: Чтение данных из текстового файла.
От: white-mrak Россия  
Дата: 16.09.05 15:38
Оценка:
Если файл не очень большой то можно так:
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;

PS медленно, но надежно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.