Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг файла 
V
    Опции темы
gather
Дата 27.5.2008, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Rescue Officer
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 13.6.2007
Где: Russia, Lipetsk

Репутация: нет
Всего: 4



Доброе время суток всем ;)

В наличии имеется файл со следующей структурой:
Код

[POLYLINE]
Type=0x6
Label=Каменный Лог
StreetDesc=Каменный Лог
CityIdx=1
RoadID=21
RouteParam=3,0,0,0,0,0,0,0,0,0,0,0
Data0=(52.61033,39.59260),(52.61024,39.59249),(52.61020,39.59239),(52.61017,39.59219)
Nod1=0,1487,0
Nod2=3,1519,0
[END]

[POLYLINE]
Type=0x6
CityIdx=1
RoadID=22
RouteParam=3,0,0,0,0,0,0,0,0,0,0,0
Data0=(52.61009,39.59466),(52.60953,39.59616)
Nod1=0,1502,0
Nod2=1,1496,0
[END]

Записей может быть ооочень много. (средний размер текстового файла 15Мб)

Посоветуйте пожалуйста, как лучше обрабатывать данный файл, учитывая то, что мне необходимо отрисовывать на объекте с помощью polyline и polygon объекты, по координатам, указанным в Data0 свойстве.

 smile 
PM MAIL WWW Skype GTalk Jabber   Вверх
Rififi
Дата 27.5.2008, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



Цитата(gather @  27.5.2008,  18:18 Найти цитируемый пост)
Посоветуйте пожалуйста, как лучше обрабатывать данный файл

построчное чтение и накопление данных между [Метка] .. [END]
для анализа отдельных строк можно воспользоваться регулярными выражениями
PM MAIL   Вверх
gather
Дата 27.5.2008, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Rescue Officer
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 13.6.2007
Где: Russia, Lipetsk

Репутация: нет
Всего: 4



Rififi, я понимаю что построчное чтение.
Каким лучше способом обрабатывать и где и как хранить обработанные данные, ибо отрисовывать надо не 1 раз. А по мере изменения координат. А читать снова весь файл - ИМХО непрактично.

Я склоняюсь в сторону TStringList, но как он поведет себя на таких объемах, не будет ли тормозить вот в чем вопрос.

PM MAIL WWW Skype GTalk Jabber   Вверх
jonie
Дата 27.5.2008, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



а чем обычные контейнеры, типа std::vector (при опред условиях, наверно, лучши выбор) хуже?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Rififi
Дата 27.5.2008, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



gather
я понимаю что построчное чтение.
тогда задавай конкретный вопросы.

то, что описывается в секции POLYLINE представляется как единая структура данных.
соответственно по мере парсинга накапливаешь массив таких структур.

как хранить обработанные данные
Type => enum
Label => std::[w]string
StreetDesc => std::[w]string
CityIdx => [u]int
RoadID => [u]int
RouteParam => int* или std::vector<int>
Data0 => массив или std::vector of Point { x, y }
Nod1 => int* или std::vector<int>
Nod2 => int* или std::vector<int>
PM MAIL   Вверх
gather
Дата 27.5.2008, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Rescue Officer
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 13.6.2007
Где: Russia, Lipetsk

Репутация: нет
Всего: 4



Rififi, извиняюсь за некорректную постановку вопроса.

В итоге. Имеем из секции Data0 std::vector of Point { x, y }

Можно пример, как использовать данный вектор? Просто никогда с ними не работал.  smile 

По остальному - огромное спасибо.
PM MAIL WWW Skype GTalk Jabber   Вверх
Lazin
Дата 27.5.2008, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



Цитата(gather @  27.5.2008,  18:57 Найти цитируемый пост)
Я склоняюсь в сторону TStringList, но как он поведет себя на таких объемах, не будет ли тормозить вот в чем вопрос.

плохо он себя поведет smile 

здесь есть 2 варианта, либо мы загружаем все в память, либо нет. В первом случае потребуется описать POLYLINE как класс, читать секции [POLYLINE]...[END], парсить и создовать объекты класса Polyline, а потом класть их в тот-же вектор...
Во втором случае можно парсить некоторое количество секций, отрисовывать их, опять парсить и тд... будет то-же самое, но памяти потребуется меньше..

Добавлено через 1 минуту и 1 секунду
Цитата(gather @  27.5.2008,  20:30 Найти цитируемый пост)
Можно пример, как использовать данный вектор? Просто никогда с ними не работал.

на форуме их вагон и маленькая тележка
PM MAIL Skype GTalk   Вверх
artsb
Дата 27.5.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(gather @  27.5.2008,  20:30 Найти цитируемый пост)
Можно пример, как использовать данный вектор?

Код

#include <vector.h>
//...
vector<int> MyVector;
// добавлять так, например в конец:
int a=10;
MyVector.push_back(a);
// удалять так:
vector<int>::iterator iter=MyVector.begin()+Index; // здесь Index - это смещение относительно начала вектора (переменная типа int)
MyVector.erase(iter);
// очистить так:
MyVector.clear();



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Rififi
Дата 27.5.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



Можно пример, как использовать данный вектор? Просто никогда с ними не работал. 
Код
struct Point { float x, y; };
std::vector<Point> v;

// создаём и инициализируем экземпляр структуры Point
Point pt;
pt.x = ...
pt.y = ...

v.push_back(pt); // копируем pt к себе (терерь размер = 1)
Point first = v[0]; // достаём из вектора копию первого элемента


PM MAIL   Вверх
gather
Дата 27.5.2008, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Rescue Officer
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 13.6.2007
Где: Russia, Lipetsk

Репутация: нет
Всего: 4



RififiartsbLazin,  Спасибо.


Rififi, Если я правильно понимаю, то в приведенном Вами примере - в вектор будут складываться значения x,y одной секции [POLYLINE][END]

Как быть, если таких секций около 15000?
PM MAIL WWW Skype GTalk Jabber   Вверх
Lazin
Дата 27.5.2008, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



Цитата(gather @  27.5.2008,  21:26 Найти цитируемый пост)
Как быть, если таких секций около 15000? 

Код


class Polyline
{
std::vector<Point> vertices;
...
public:
...
};

std::vector<Polyline> sections;


как то так
PM MAIL Skype GTalk   Вверх
Rififi
Дата 27.5.2008, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



то есть код парсинга может выглядеть примерно так

Код
Reader rd("data.txt"); // Сферический реадер из файла
while (!rd.eof()) // крутим цикл пока не конец файла
{
    Polyline pl;
    if (rd.Parse(pl)) // если парсинг очередной секции произведён успешно...
        sections.push_back(pl);
}
// дальше юзаем заполненный вектор класов
(void) sections;

PM MAIL   Вверх
gather
Дата 27.5.2008, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Rescue Officer
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 13.6.2007
Где: Russia, Lipetsk

Репутация: нет
Всего: 4



Ясно, спасибо.
PM MAIL WWW Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0810 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.