Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2010, 21:01   #1
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию ВАРИАНТЫ ПАРСИНГА

...
N1 TOOL(9,1536.85,200,1)
X1536.85Y200
X1536.85Y158.92Z=DC(90)M25
Y170.93
X1371Y191.425
Y199.578
Y207.73
X15Y200.225Z=DC(0)
...

Это строки, из которых нужно вытянуть символы (это и числа и комбинации символов и слова, а именно: в первой строке нужно вытянуть N1, TOOL, 9 - причем разложить эти три слова в разные Label), т.е:
Label1.Caption:= 'N1';
Label2.Caption:= 'TOOL';
Label3.Caption:= '9';
А вот со второй строкой по-другому:
если первый символ Х, то число после него в Label4, а после Y - в Label5.
А также если в конце стоит М - то число после него в Label6.
-Таких строк ОЧЕНЬ много, N1 меняется на N2, N3, N4 может до 50 дойти.
-Может быть MTOOL или TOOL.
-Числа соответственно никогда не повторяются, могут иметь до 6 цифр плюс дробный разделитель(.) между ними.
-В конце вместо М может Z стоять (Z=DC(0) - тогда 0 вытаскиваем, но может вместо него любое число до 360 стоять).

Решение вижу в посимвольной проверке каждой строки, типа этого:
...
x:= 1;
I:= 0;
C:= Form1.Memo1.Lines.Count;
repeat
m: string[x]; //??? - изменяем длину
Form1.Label1.Caption:= Form1.Memo1.Lines[I];
//???? - здесь проверка
//???? - а здесь обработка
I:= I+1;
until
I = C;
...
Это приблизительно, не надо ориентироваться по этому коду. Возможно есть более оптимальное решение вместо Repeat-Until в данном случае?

И если проверяемый символ совпадает с заданными (X,Y,Z,M,N,E) то проводим дальнейшую обработку строки с этим символом.
Т.е.:
-Если Х - то числа после него записываем в Label1 пока следующий проверямый символ не окажется отличным от числа (совпадет с заданными) или конец строки.
-Если Y - тоже самое, но число пишем в Label2.
-Если М - число после него в Label3.После этого числа конец строки.
-Если Z=DC(0) - число в скобках пишем в Label4. После него может быть еще значения.
-Если N - число после него в Label5.
-Если конец строки - то с полученными значениями проводим определенные действия, например выводим канвой на форму изображение по полученным координатам.
-Если E - конец обработки программы полностью.

Проверять именно слева, а не с конца, как говорят некоторые.

В общем, нужен определенный алгоритм посимвольной проверки и сравнения строк + выполнение действий при совпадении и до перехода на следующую строку.

Говорите что тема парсинга много раз уже поднималась? Поверьте это такой парсинг, инфы по которому я даже в Гугле не нашел. Только помощь нужна с описанием действий, а не просто нарезка чужих кодов. Желательно не просто функции, а с примером кода и описанием.
Описание нужно для адекватной интеграции приведенных фрагментов.

Все получат + , обещаю (если поможет совет).
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 04.09.2010, 23:33   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

всё абсолютно реально.
Вот только идёя с помещением переменных в LabelXX мне кажется порочной.
А что делать, если встретиться ДВЕ (или более) строчки с одинаковым типом строки?! (ну, например,
X1536.85Y200
X1536.85Y158.92Z=DC(90)M25
что пойдёт в Label1 ?!

это раз.

второе.
кроме того, мне абсолютно не ясен смысл разбора строки.
Вы сами то понимаете? Вот, например:
Цитата:
если первый символ Х, то число после него в Label4, а после Y - в Label5.
...
-Если Х - то числа после него записываем в Label1 пока следующий проверямый символ не окажется отличным от числа (совпадет с заданными) или конец строки.
так всё таки что куда пишется, если первый символ X ?!

Что должно явится результатом парсинга? Заполненные лейблы Label1, Label2 .... LabelXXX ?

постарайтесь разжевать, что Вам надо, тогда будет легче оказать Вам конкретную помощь.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.09.2010, 23:51   #3
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

1)В Labels после (Х,Y,M,Z,N,E) помещаем только число.
2)Заданные значения - это (Х,Y,M,Z,N,E) - они определяют куда помещать число следующее за этим значением (Label1 или Label2 и т.д.).
3)Числа помещаемые в Label тут же должны считываться другой процедурой, выполнять по этому значению функцию, и только потом числа меняются на другие.
4)Они одинаковы не полностью: видите там У-коэффициент другой? и Z в конце стоит. Это значит что координаты уже другие.

Почему в Label? это только для пошагового тестирования программы. Потом работаем только с динамическими переменными. Например: меняем "Label1.Caption:=" на "Х:=".

5)Результат парсинга - вывод графической информации (канвой на форму) по сгенерированному машиной програмному коду(Х и У - это координаты).
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Компоненты для парсинга страниц!!! $T@LKER Работа с сетью в Delphi 14 20.02.2011 17:17
Как из мемо считать i-ую строку для парсинга. TwiX Общие вопросы C/C++ 0 17.12.2009 21:49
Программа для парсинга описаний chilinik Общие вопросы Delphi 2 07.10.2009 10:17
Мелкая ошибка парсинга Legenda PHP 4 02.10.2008 17:52
пример парсинга Stanislav Общие вопросы Delphi 4 14.01.2008 03:48