Форум программистов, компьютерный форум CyberForum.ru

Парсинг адресной строки, хочу извлечь индекс и название города - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
25.12.2012, 18:45     Парсинг адресной строки, хочу извлечь индекс и название города #1
Всем доброго дня.

Хочу распарсить такой вот файлик:

------------------------------------------------------------
125414, Москва г, Петрозаводская ул, дом № 24а, корпус 2
125493, Москва г, Смольная ул, дом № 5
Москва г, Онежская ул, дом № 11.11.2008"
------------------------------------------------------------

Считать индекс в отдельный массив, потом название города в отдельный массив, скопировать их в общий массив символов и вывести в консоль. Нашел на сайте (cyberforum) пример, сделал по аналогии, чет ни фига не работает, гляньте, если не сложно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
char zipcode[10] = { '0' };
char city[20] = { '0' };
char finalstring[30] = { '0' };
 
ifstream parsing_f ("parse_addresses.txt");
        while (!parsing_f.eof())
    {       
        parsing_f.getline(buff, 1024, '\n');
        
        char*  ptr_zip = buff;
            for (int zc = 0; zc < 10; zc++)
                zipcode[zc] = ' ';
        while ((ptr_zip = get_zipcode (zipcode, ptr_zip)))
        {
         for (int i = 0; i < 10; i++)
             finalstring[i] = zipcode[i]; }
            
        for (int ct = 0; ct < 20; ct++)
                city[ct] = ' ';
        const char * ptr_city = buff;
        while ((ptr_city = get_city(city, ptr_city, " г,")))
        {
         for (int i = 10; i < 30; i++)
             finalstring[i] = city[i]; }
                
        finalstring[30] = '\0';
        cout << finalstring << endl;
            
    }
        
    parsing_f.close();  
 
//функции получения адреса и индекса:
 
char*  get_zipcode(char* strzip, char* sourcestr) {
    
    char* ps = sourcestr;
    for (int i = 0; *ps && i < 6 &&  isdigit(*ps); i++)
    *strzip++ = *ps++;
 
    return ps;
}
 
const char*  get_city(char* strcity, const char* sourcestr, const char* searchstr) {
    const char* ps = strstr(sourcestr, searchstr);
    if(! ps)
        return NULL;
    while ((&sourcestr[0] != ps) && (*ps != ' '))
        ps--;
    while (*ps && *ps != ' ')
        *++strcity = *ps++;   
    return ps;
}
В функии, которая возвращает адрес символы, по которым осуществляется поиск, идут после названия города. Т.е. я сначала хочу "отмотать" указатель на название города, а потом уже считать его в массив символов. Поэтому и проверка: (&sourcestr[0] == ps) - чтобы не выйти за границы массива - город может начинаться с первого же символа в строке.

ЗЫ Только не советуйте boost и прочее, задачка вроде элементарная.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2012, 18:45     Парсинг адресной строки, хочу извлечь индекс и название города
Посмотрите здесь:

Извлечь из строки числа C++
Строки. Спортивные команды одного города. C++
получить индекс строки C++
C++ Для заданной вершины p найти маршруты в другие города, хотя бы один маршрут для каждого города
Как извлечь только цифры из строки C++
Извлечь число из строки C++
C++ Из строки извлечь символы операций в стек, а цифры - в другую строку
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
26.12.2012, 17:34  [ТС]     Парсинг адресной строки, хочу извлечь индекс и название города #21
Цитата Сообщение от Avazart Посмотреть сообщение
Ну не знаю если файл находится, значит нет совпадений с регуляркой.
Может содержание файла изменилось?
Не, не менялось. Почему-то в этом цикле while вообще ничего не выводится в консоль. Попробовал просто строчку текста вывести, добавив к первой: cout << "test";
Не выводится. А вне цикла - все ок.


Ну я об этом и говорил что нужно прописывать пути руками в проекте как и для любой сторонней либы...

Чтоб не компилировать исходники вручную ...
А, ну ясно. Т.е. прописывать все-таки нужно? А что именно? Скажем, по адресу VC++ Directories -> Include Directories у меня сейчас прописано: "$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;"
И что нужно добавить? А главное - прописать пути в Include Directories и Library Directories - и все, или ещё что-то где-то надо прописывать-добавлять?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
Нарушитель
6952 / 5190 / 256
Регистрация: 10.12.2010
Сообщений: 22,769
Записей в блоге: 17
26.12.2012, 17:36     Парсинг адресной строки, хочу извлечь индекс и название города #22
Включения и либы у меня это
Код
C:\Program Files\boost\boost_1_50
C:\Program Files\boost\boost_1_50\lib\
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
26.12.2012, 18:04  [ТС]     Парсинг адресной строки, хочу извлечь индекс и название города #23
Цитата Сообщение от Avazart Посмотреть сообщение
Включения и либы у меня это
Код
C:\Program Files\boost\boost_1_50
C:\Program Files\boost\boost_1_50\lib\
Дык а как это - прямо так и прописывать? Там жеж какой-то свой формат, из серии: ;$(FrameworkSDKDir)\include;"
Что добавить: ;$(C:\Program Files\boost\boost_1_50)\include;" ??
Avazart
Нарушитель
6952 / 5190 / 256
Регистрация: 10.12.2010
Сообщений: 22,769
Записей в блоге: 17
26.12.2012, 18:05     Парсинг адресной строки, хочу извлечь индекс и название города #24
Так и писать ( без $ и скобок ) , т.е добавить
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
26.12.2012, 18:09  [ТС]     Парсинг адресной строки, хочу извлечь индекс и название города #25
Цитата Сообщение от Avazart Посмотреть сообщение
Так и писать ( без $ и скобок ) , т.е добавить
А слово include нужно? Ну, т.е. вот такую строку добавить:

(C:\Program Files\boost\boost_1_50)\include;

?
Avazart
Нарушитель
6952 / 5190 / 256
Регистрация: 10.12.2010
Сообщений: 22,769
Записей в блоге: 17
26.12.2012, 18:12     Парсинг адресной строки, хочу извлечь индекс и название города #26
Именно так
Код
C:\Program Files\boost\boost_1_50
C:\Program Files\boost\boost_1_50\lib\
без всякого творчества...

Первую строчку во включение, вторую в либы.
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
26.12.2012, 18:16  [ТС]     Парсинг адресной строки, хочу извлечь индекс и название города #27
Цитата Сообщение от Avazart Посмотреть сообщение
Именно так
Код
C:\Program Files\boost\boost_1_50
C:\Program Files\boost\boost_1_50\lib\
без всякого творчества...

Первую строчку во включение, вторую в либы.
Добавил. Ни фига ) Если в проекте прописать: #include <boost/regex.hpp>
подчеркивает, жалуясь на "cannot open source file "boost/regex.hpp"

PS А, тьфу блин, у меня же путь другой (не 1_50, а 1_51)

PPS Вот, теперь другое дело (ну, в смысле - ничего не подчеркивает)
Avazart
Нарушитель
6952 / 5190 / 256
Регистрация: 10.12.2010
Сообщений: 22,769
Записей в блоге: 17
26.12.2012, 18:18     Парсинг адресной строки, хочу извлечь индекс и название города #28
Значит не правильно прописал ...

Ты хоть проверил может у тебя буст в другом месте установился или папки не так называются...
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
26.12.2012, 18:26  [ТС]     Парсинг адресной строки, хочу извлечь индекс и название города #29
Цитата Сообщение от Avazart Посмотреть сообщение
Значит не правильно прописал ...

Ты хоть проверил может у тебя буст в другом месте установился или папки не так называются...
Да не, все ок. Спасибо тебе за советы. Уже поправил и перекомпилил первый твой вариант(ну, в смысле - полностью), который:

C++
1
boost::regex re("([[:digit:]]{0,6}),?\\s*(.*?)\\sг,(.*)");
А инклюд <regex> выкинул нафиг, чтобы какого-нить конфликта имен не было.

Все компилится и даже результат похож: хрен че выводится в консоль))
Что уже неплохо)
Avazart
Нарушитель
6952 / 5190 / 256
Регистрация: 10.12.2010
Сообщений: 22,769
Записей в блоге: 17
26.12.2012, 18:31     Парсинг адресной строки, хочу извлечь индекс и название города #30
Насчет std::regex std::regex и boost::regex

Добавлено через 2 минуты
Цитата Сообщение от Excogit8er Посмотреть сообщение
Все компилится и даже результат похож: хрен че выводится в консоль))
Что уже неплохо)
Странно, но это говорит только о том что совпадений не находит, значит либо опечатка ли регулярка не подходит по файл.

Кстати регулярки чувствительны к локали... т.е к кодировке файла
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
26.12.2012, 18:35  [ТС]     Парсинг адресной строки, хочу извлечь индекс и название города #31
Цитата Сообщение от Avazart Посмотреть сообщение
Насчет std::regex std::regex и boost::regex
Да ладно, зачем нужен этот std::regex, если я уже подключил boost? Думал, его гиморно подлкючать, а выяснилось, что вовсе нет.

Странно, но это говорит только о том что совпадений не находит, значит либо опечатка ли регулярка не подходит по файл.
Кстати регулярки чувствительны к локали... т.е к кодировке файла
А вот кстати очень может быть, что что-то с кодировкой... Но у меня прописано в проекте:
setlocale(0, ".1251");

И текст выводится и в файл, и в консоль... (проверял)
Avazart
Нарушитель
6952 / 5190 / 256
Регистрация: 10.12.2010
Сообщений: 22,769
Записей в блоге: 17
26.12.2012, 18:39     Парсинг адресной строки, хочу извлечь индекс и название города #32
А кодировка файла cp1251 ?
( у меня и без установки локали работало)
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
26.12.2012, 18:46  [ТС]     Парсинг адресной строки, хочу извлечь индекс и название города #33
Цитата Сообщение от Avazart Посмотреть сообщение
А кодировка файла cp1251 ?
( у меня и без установки локали работало)
Ну да, вроде как cp1251. Тут я уверен на 100500%, потому что перед этим строка конвертируется как раз в cp1251 таким вот нехитрым способом:

C++
1
2
3
4
5
6
7
8
while (!f.eof())
 {
   f.getline(buff, 1024, '\n');
     
      MultiByteToWideChar(CP_UTF8, 0, buff, 1024, wbuff, 1024);
      WideCharToMultiByte(1251, 0, wbuff, 1024, buff, 1024, NULL, NULL);    
      outFileStr << buff << endl;
    }
(Изначально файл был в кодировке UTF-8)
Вроде бы boost "на лету" конвертирует кодировки? Потому как без буста я что-то нашел только способ конвертировать сначала в UTF-16 при помощи MultiByteToWideChar, а сразу за этим - в cp1251 при помощи WideCharToMultiByte.

Вообще это не рабочий проект конечно же, так, балуюсь (пытаясь побольше в языке разобраться по ходу всего этого)
Avazart
Нарушитель
6952 / 5190 / 256
Регистрация: 10.12.2010
Сообщений: 22,769
Записей в блоге: 17
26.12.2012, 18:50     Парсинг адресной строки, хочу извлечь индекс и название города #34
Цитата Сообщение от Excogit8er Посмотреть сообщение
(Изначально файл был в кодировке UTF-8)
Ну подозреваю что там мог закрасться "невидимый" символ.
Попробуйте создать текстовый файл и копирнуть туда пример текста который вы на форуме выкладывали, ну и проверить с ним программу.
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
26.12.2012, 18:56  [ТС]     Парсинг адресной строки, хочу извлечь индекс и название города #35
Цитата Сообщение от Avazart Посмотреть сообщение
Ну подозреваю что там мог закрасться "невидимый" символ.
Попробуйте создать текстовый файл и копирнуть туда пример текста который вы на форуме выкладывали, ну и проверить с ним программу.
Ты прав, эз южуал. Проверил с теми 3мя строками, что выкладывал на форуме. И правда - все выводится в консоль:

<125414> [Москва]
<125493> [Москва]
<> [Москва]

Круто. Попробую щас поэкспериментировать с этим регулярным выражением)
Пасибо.
Avazart
Нарушитель
6952 / 5190 / 256
Регистрация: 10.12.2010
Сообщений: 22,769
Записей в блоге: 17
26.12.2012, 19:05     Парсинг адресной строки, хочу извлечь индекс и название города #36
Для перекодирования я использовал iconv
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
26.12.2012, 19:15  [ТС]     Парсинг адресной строки, хочу извлечь индекс и название города #37
Цитата Сообщение от Avazart Посмотреть сообщение
Для перекодирования я использовал iconv
Ага, thanx. Я, кстати, понял, почему он ничего не выводил. Не в кодировке дело. Там первой строкой шла такая:
"Москва, Конаковский пр-д, дом № 10"
Видимо, при проверке на условие, где в строке должна быть обязательно " г," цикл тут же и заканчивался, раз условие не верно. А там есть и пустые строки вообще, или где NULL написано вместо адреса

Насчет кодировки. Да вроде бы и MultiByteToWideChar справляется... Хотя вот именно про boost читал, что там якобы вообще все элементарно и "на лету".
Avazart
Нарушитель
6952 / 5190 / 256
Регистрация: 10.12.2010
Сообщений: 22,769
Записей в блоге: 17
26.12.2012, 19:21     Парсинг адресной строки, хочу извлечь индекс и название города #38
Цитата Сообщение от Excogit8er Посмотреть сообщение
Насчет кодировки. Да вроде бы и MultiByteToWideChar справляется... Хотя вот именно про boost читал, что там якобы вообще все элементарно и "на лету".
Честно говоря не знаю буст большой...

А MultiByteToWideChar() только под виндой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2012, 19:28     Парсинг адресной строки, хочу извлечь индекс и название города
Еще ссылки по теме:

C++ Как извлечь числа из строки
C++ Строки. Игра в города
C++ Найти количество всевозможных маршрутов от города до города
Составить программу которая на введенную дату выдает название города C++
C++ В заданной квадратной матрице вывести индекс строки, полностью повторяющей все элементы первой строки

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
26.12.2012, 19:28  [ТС]     Парсинг адресной строки, хочу извлечь индекс и название города #39
Цитата Сообщение от Avazart Посмотреть сообщение
Честно говоря не знаю буст большой...

А MultiByteToWideChar() только под виндой.
А я кроме как под виндой и не пробовал кодить) Да и то, что "пробовал", пока что нельзя особенно осмысленным назвать. Так вот, неспешно, рабочий день и прошел. И это радует.
Yandex
Объявления
26.12.2012, 19:28     Парсинг адресной строки, хочу извлечь индекс и название города
Ответ Создать тему
Опции темы

Текущее время: 03:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru