Поиск:

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


Rescue Officer
*


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

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



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

Возникла задача распарсить строку вида:
Код

Data0=(52.61017,39.59449),(52.61041,39.59352),(52.61116,39.59305),(52.61153,39.59297),(52.61155,39.59271),(52.61290,39.59254),(52.61288,39.59232),(52.61140,39.59252),(52.61104,39.59222),(52.61061,39.59222),(52.61080,39.58958),(52.61099,39.58917),(52.61116,39.58897),(52.61138,39.58880),(52.61159,39.58872),(52.61204,39.58865),(52.61544,39.58840),(52.61580,39.59745),(52.61477,39.59758),(52.61211,39.59784),(52.61194,39.59777),(52.61185,39.59769),(52.61106,39.59623)

на отдельные подстроки вида:
Код

52.61017,39.59449


Как оптимальнее всего сделать это? количество пар в скобках в полной строке может быть различным.

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

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



регулярные выражения

хорошо реализованы в boost


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
gather
Дата 17.5.2008, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Rescue Officer
*


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

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



bronislav, да я уже тоже начал смотреть в ту сторону. А можете дать пример регулярки, которая выцепит из этой строки пару чисел 52.61017,39.59449 ну и т.д?  smile 
PM MAIL WWW Skype GTalk Jabber   Вверх
bronislav
Дата 17.5.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

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



К сожалению я в регулярных выражениях не силен =(
но попробую

Можно еще спирит использовать, но это конечно тыжелая артилерия

Я так понимаю, что числа действительные? Или могут быть и целые?

Добавлено через 14 минут и 14 секунд
Структура твоего ввода такая: идет некая последовательность символов, потом '=', потом в фигурных сковках через запятую пары действительных чисел?


Это сообщение отредактировал(а) bronislav - 17.5.2008, 19:17


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
artsb
Дата 17.5.2008, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Может я не совсем понял. Поправте если что.
После выполнения этого кода:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Clear();
AnsiString str=Edit1->Text;
int pos;
while(pos=str.Pos("),("))
{
        Memo1->Lines->Add(str.SubString(2,pos-2));
        str.Delete(1,pos+1);
}
}

в мемо хранится:
Цитата

52.61017,39.59449
52.61041,39.59352
52.61116,39.59305
52.61153,39.59297
52.61155,39.59271
52.61290,39.59254
52.61288,39.59232
52.61140,39.59252
52.61104,39.59222
52.61061,39.59222
52.61080,39.58958
52.61099,39.58917


gather, так надо?


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


Rescue Officer
*


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

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



Вобщем имеем.
строку последовательностей вида
Код

(широта, долгота),(широта, долгота),...........(широта, долгота)

Требуется:
разобрать данную строку на отдельные координаты широта и долгота и занести в базу.
под 
Код

(52.61017,39.59449)

очень хорошо подходит регулярное выражение вида
Код

/([+-]?\d+\.?\d*)\,([+-]?\d+\.?\d*)/

но! Как я ни пытался подключить pcre к проекту, ничего не выходит.
в .h файл добавляю
Код

#include "pcre.h"
#include "pcreposix.h"
#pragma comment(lib,"pcre.lib")
#pragma comment(lib,"pcreposix.lib")

но 
Код

pcre_version()
 выводит 2.01 21-Oct-1998, хотя пытаюсь подключить версию 7.0
Брал пример вот отсюда: http://webcode.ru/re/pcre/ - работать не хочет. Говорит нет совпадений :(

Добавлено через 50 секунд
artsb, ааагроменное спасибо. Как обычно я начал со сложных способов )

Добавлено через 1 минуту и 28 секунд
Но вопрос pcre все равно остается. Добавлю только что подключить его пытаюсь к CodeGear™ C++Builder® 2007  Version 11.0.2902.10471
PM MAIL WWW Skype GTalk Jabber   Вверх
bronislav
Дата 17.5.2008, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

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



А почему ты не хочеш использовать boost?




--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
gather
Дата 17.5.2008, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Rescue Officer
*


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

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



bronislav, дело в том, что я не нашел нормальной документации по подключению его в проектам, написанным на BCB.
 smile 
поэтому и решил попробовать pcre
PM MAIL WWW Skype GTalk Jabber   Вверх
RDC
Дата 17.5.2008, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 26.1.2008

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



Гутен таг, майн либе киндер. smile
Вот способ, я назвал его "НАИТУПЕЙШИЙ", написан от нечего делать. Так что не пинать.
Код

AnsiString Parser(AnsiString Source)
{
        AnsiString W;
        for(int i=1; i!=Source.Length(); i++) {
                if (Source[i]=='(')
                        for(int j=i+1; j!=Source.Length(); j++) {
                                if (Source[j]!=')')
                                        W+=Source[j];
                                else {
                                        W+="\n";
                                        break;
                                }
                        }
        }
        return W;
}


А пока я его писал, тут уже сообщений набралось, эх опоздал (

Это сообщение отредактировал(а) RDC - 17.5.2008, 20:29
--------------------
Живопись
PM MAIL   Вверх
Akeem
Дата 17.5.2008, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 14.7.2006
Где: Киев/Украина

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



Вот тут класс по управлению стрингами. Класс написан на Джава, но его легко импортить на С.
Первая функция это парсинг строки в список по определенному сепаратору.

для твоего случая это будет ","

Код


/**
 * Class contains different utils functions for work with strings, string arrays, lists
 * @author Oleksii.Zozulenko
 * <b>Create data</b> 04/18/2008
 */
public class StringUtils
{
    /**
     * Function convert string to arraylist use separator for partition
     * @param String sValue
     * @param String sSep
     * @return ArrayList<String> lsOutList
     * @throws Exception
     */
    public static ArrayList<String> StrToList(String sValue, String sSep) throws Exception
    {
        ArrayList<String> lsOutList = new ArrayList<String>();
        
        try
        {
            int iSep = 0;
            
            while (iSep < sValue.length())
            {
                iSep = sValue.indexOf(sSep);
                lsOutList.add(sValue.substring(0, iSep));
                sValue = sValue.replace(sValue.substring(0, sValue.indexOf(sSep) + sSep.length()), "");
            }
            
            if (sValue.length() != 0)
            {
                lsOutList.add(sValue);
            }
            
            return lsOutList;
        }
        catch (Exception oExc)
        {
            throw oExc;
        }
    }
    
    /**
     * Function convert arraylist to string used separator between arraylist nodes in string
     * @param ArrayList<String> lsValueList
     * @param String sSep
     * @return String sOutStr
     * @throws Exception
     */
    public static String ListToStr(ArrayList<String> lsValueList, String sSep) throws Exception
    {
        String sOutStr = "";
        
        try
        {
            for (int i = 0; i <  lsValueList.size(); i++)
            {
                sOutStr = sOutStr.concat(lsValueList.get(i) + sSep);
            }
            
            return sOutStr;
        }
        catch (Exception oExc)
        {
            throw oExc;
        }
    }
    
    /**
     * Function convert array to string use separator between array values in string
     * @param String [] lsValueList
     * @param String  sSep
     * @return String  sOutStr
     * @throws Exception
     */
    public static String ArrayToStr(String [] lsValueList, String sSep) throws Exception 
    {
        String  sOutStr = "";
        
        try
        {
            for (int i = 0; i <  lsValueList.length; i++)
            {
                sOutStr = sOutStr.concat(lsValueList[i] + sSep);
            }            
            
            return sOutStr;
        }
        catch (Exception oExc)
        {
            throw oExc;
        }
    }
    
    /**
     * Function convert arraylist to array
     * @param ArrayList<Object> lsInList
     * @return Object [] lsObjects
     * @throws Exception
     */
    public static Object [] ListToArray(ArrayList<Object> lsInList) throws Exception
    {
        Object [] lsObjects = null;
        
        try
        {
            lsObjects = new Object[lsInList.size()];
            
            for (int i = 0; i < lsInList.size(); i++)
            {
                lsObjects[i] = lsInList.get(i);
            }
            
            return lsObjects;
        }
        catch (Exception oExc)
        {
            throw oExc;
        }
    }
    
    /**
     * Function reverse string
     * @param String sTarget
     * @return String sRevStr
     * @throws Exception
     */
    @SuppressWarnings("static-access")
    public static String StrReverse(String sTarget) throws Exception
    {
        String sRevStr = "";
        
        try
        {
            for (int i = sTarget.length(); i < 0; i--)
            {
                sRevStr = sRevStr.concat(sTarget.valueOf(i));
            }
            return sRevStr;
        }
        catch (Exception oExc)
        {
            throw oExc;
        }
    }

}



--------------------
Мир огромен и мы только муравьи в нём! (С) formicha

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


Rescue Officer
*


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

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



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

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

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

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

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


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

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


 




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


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

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