обработка словесно-числовых строк из файла

Общие вопросы: версии и диалекты, синтаксис языка, cтруктуры и типы данных (массивы, строки, списки...), обработка данных и т.д.
Ответить
fiascko
Сообщения: 4
Зарегистрирован: 25 мар 2010, 22:59

25 мар 2010, 23:02

ребята, прошу помощи у специалистов (сам таковым не являюсь, поэтому сразу прошу прощения за некорректность моих выссказываний).
Имеется файл.txt со следующим содержимым:
$GPGGA 072520.000 5553.8635 N 03805.6086 E 1 07 1.8 141.5 M 14.1 M 0000 5D
$GPGSA A 3 18 19 21 22 26 06 03 3.8 1.8 3.3 33
$GPGSV 3 1 12 22 75 160 42 06 58 214 41 03 57 236 42 18 53 072 37 7C
$GPGSV 3 2 12 19 51 289 42 26 38 118 44 21 28 103 38 14 17 159 28 71
$GPGSV 3 3 12 15 13 032 24 12 099 24 27 08 065 20 09 04 075 7D
$GPRMC 072520.000 A 5553.8635 N 03805.6086 E 0.11 200.74 040310 0E
$GPGGA 072521.000 5553.8635 N 03805.6086 E 1 07 1.8 141.5 M 14.1 M 0000 5C
и т.д. Мне необходимо обработать данный массив строк. Для этого придерживаюсь простого для меня алгоритма:
1. Импортирую файл в DELPHI, записывая построчно в МЕМО.
2. Так как файл содержит 4 вида строк, называемые $GPGGA,$GPGSA..., то я проверяю,к какой из перечисленных относится каждая строка, copy(stro,1,6)
3. Для различных строк должен ввести новые переменные равные соответствующим элементам строки , при этом использую опять же функцию copy (т.к. одинаковые элементы стоят на тех же местах).
4. А далее по сути я могу производить различные действия над этими переменными.
Не знаю, насколько логичны мои рассуждения, но чисто теоретически это должно получиться. А вот практически как раз не получается. Вот текст программы, вычисляющий количество строк файла (n), а также среднее число sr (среднее из чисел, стоящих первыми после $GPGGA, т.е. 072520.000, 072521.000 и т.д.)
var


f: TextFile; fName: String[80]; // имя файла

buf:String[80]; // буфер для чтения из файла
i,n:integer;
nstro:array[1..100000] of string[6];
stro:array[1..100000] of string[100];
utc:array[1..100000] of real;
summ,sr:real;

begin
summ:=0;
n:=memo1.lines.count;
fName := Edit1.Text; AssignFile(f, fName);
Reset(f);
if IOResult <> 0 then
begin
MessageDlg ('Ошибка доступа к файлу ' + fName,
mtError,[mbOk],0); exit;
end;// чтение из файла
while not EOF(f) do
begin
readln(f, buf); // прочитать строку из файла
Memo1.Lines.Add(buf); // добавить строку в поле Memo1
end;
for i:=0 to Memo1.lines.count do
begin
stro:=memo1.lines ;
nstro:=copy(stro,1,6);
end;
for i:=0 to Memo1.lines.count do
begin
if nstro='$GPGGA' then
UTC:=strtofloat(copy(stro,8,10));
end;
summ:=summ+utc;sr:=summ/n;
showmessage(floattostr(sr)); edit2.Text:=inttostr(n);
CloseFile(f); // закрыть файл

end;


Наверняка текст программы, мягко говоря , не правилен. Прошу строго не судить и не ругаться, я далеко не спец в этом деле. Еще раз хочу сказать, что данный метод составления программы наиболее прост для моего понимания.
Ну ис обственно вопрос: что в моих рассуждениях и составлении программы неправильно. Зараенее всем благодарен
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

26 мар 2010, 10:13

Зачем в мемо выводить, раскидай прямо в цикле чтения файла по массивам или куда ещё нужно..
И файл закрывай после чтения, незачем его держать дольше чем нужно..
[syntax=Delphi] [/syntax]
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

30 мар 2010, 16:58

1. Есть такой объект TStringList он умеет загружать в себя файл одной строкой.
2. Громоздкая конструкция проверки - используйте функцию Pos чтобы узнать есть ли в строке соответствующая подстрока.
Изображение
Ответить