Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Парсинг строки


Автор: gather 17.5.2008, 16:11
Доброе время суток всем!

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

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


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

Автор: bronislav 17.5.2008, 18:57
регулярные выражения

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

Автор: gather 17.5.2008, 19:11
bronislav, да я уже тоже начал смотреть в ту сторону. А можете дать пример регулярки, которая выцепит из этой строки пару чисел 52.61017,39.59449 ну и т.д?  smile 

Автор: bronislav 17.5.2008, 19:15
К сожалению я в регулярных выражениях не силен =(
но попробую

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

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

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

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

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, так надо?

Автор: gather 17.5.2008, 19:45
Вобщем имеем.
строку последовательностей вида
Код

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

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

(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

Автор: bronislav 17.5.2008, 19:57
А почему ты не хочеш использовать boost?


Автор: gather 17.5.2008, 20:13
bronislav, дело в том, что я не нашел нормальной документации по подключению его в проектам, написанным на BCB.
 smile 
поэтому и решил попробовать pcre

Автор: RDC 17.5.2008, 20:15
Гутен таг, майн либе киндер. 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;
}


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

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

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

Код


/**
 * 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;
        }
    }

}

Автор: gather 17.5.2008, 22:20
спасибо всем.
вопрос решен  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)