Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
Нарушитель
68 / 26 / 24
Регистрация: 23.10.2015
Сообщений: 26
1

Парсинг строк: выделить из каждой строки первые три числа, разделенные запятой

15.09.2017, 00:11. Показов 1528. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть строки вроде:

Код
192,216,10353,2,0,P|244:184|256:40,1,210,0|2,0:0|0:0,0:0:0:0:
344,28,11708,6,0,P|364:84|504:124,1,210,0|2,0:0|0:0,0:0:0:0:
484,212,13064,2,0,L|504:360,1,140
418,348,14080,1,2,0:0:0:0:
Как без использования <regex> вытащить с каждой строки первые три числа, разделенные запятой?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2017, 00:11
Ответы с готовыми решениями:

Строка содержит слова, разделенные запятой. После каждой запятой вставить пробел
1.1 В заданной строке слова разделены пробелами (кол-во пробелов произвольное). Вывести текст так,...

Переставить три первые цифры числа справа от запятой в обратном порядке
Извините за столько глупое задание, но я никак не могу понять, как можно в вещественном числе не...

Как выделить подстроки в строке, разделенные запятой ?
Собственно вопрос в том, как лучше отпарсить строку так, чтобы выделить подстроки разделенные...

RichEdit: выделить жирным первые несколько символов каждой новой строки
Доброго времени суток! Подскажите, как в RichEdit'e организовать, например выделение жирным шрифтом...

5
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
15.09.2017, 07:43 2
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
#include <iostream>
#include <vector>
#include <sstream>
#include <array>
#include <string>
#include <algorithm>
 
typedef std::array<int, 3> Elem;
 
bool parseString(const std::string & str, Elem & el)
{
    size_t pos = 0;
    
    std::istringstream strm(str);
    
    std::string tmp;
    while (std::getline(strm, tmp, ',') && pos != el.size())
    {
        if (std::all_of(tmp.cbegin(), tmp.cend(), ::isdigit) == false)
            return false;
 
        el[pos++] = std::stoi(tmp);
    }
    
    return strm.good() || 
           std::count(str.cbegin(), str.cend(), ',') == el.size() - 1;
}
 
int main()
{
    std::vector<Elem> elems;
    
    std::string tmpStr;
    while (std::getline(std::cin, tmpStr))
    {
        Elem tmpElem;
        if (parseString(tmpStr, tmpElem) == false)
        {
            std::cerr << "Failed to parse string: " << tmpStr << "\n";
            continue;
        }
        
        elems.push_back(tmpElem);
    }
    
    for (const auto & elem : elems)
    {
        std::cout << "1: " << elem[0];
        for (size_t it = 1; it < elem.size(); ++it)
            std::cout << ", " << it + 1 << ": " << elem[it];
        std::cout << "\n";
    }
}
1
Нарушитель
68 / 26 / 24
Регистрация: 23.10.2015
Сообщений: 26
15.09.2017, 10:16  [ТС] 3
GbaLog-, я конечно понимаю, C++ way. Но вчера я написал такое временное решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vector<HitObject> objects;
wstring line;
getline(<...>, line) { // Чтение файла по строкам
    <...> // Проверка строки
 
    int objProp[3];
    int currPos = 0;
    int prevPos = -1;
    for (int i = 0; i < 3; i++) {
        currPos = line.find(L",", prevPos+1);
        objProp[i] = stoi(line.substr(prevPos+1, currPos-prevPos-1));
        prevPos = currPos;
    }
    objects.push_back(HitObject{objProp[0], objProp[1], objProp[2]});
}
Использовать stringstream, как по мне, достаточно дорого. Можете сравнить оба варианта и выделить недостатки и преимущества?
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
15.09.2017, 10:34 4
getline + ',' 3 параметром или string::find с указанием стартовой позиции.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
15.09.2017, 11:33 5
Цитата Сообщение от Atakai Посмотреть сообщение
Можете сравнить оба варианта и выделить недостатки и преимущества?
по скорости ваш алгоритм, очевидно, быстрее.
но, при небольшой модификации, мой становится практически таким же быстрым.
если уж важна скорость, то можно написать алгоритм на C.
мой алгоритм более безопасен, т.к. предоставляет "защиту" на уровне стандартной библиотеки с++.
на счёт читаемости вопрос не объективный, но мне мой вариант читается легче, чем всякие магические вычитания.

p.s. советую prevPos и currPos заменить с int на size_t.
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
15.09.2017, 12:46 6
Atakai, нужно много всего учитывать:
могут ли быть строчки типа таких?
Код
192,216,
,,344,,28,11708,6,0,P|364:84|504:124,1,210,0|2,0:0|0:0,0:0:0:0:
0
15.09.2017, 12:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2017, 12:46
Помогаю со студенческими работами здесь

Вывести в Memo первые три сиимвола каждой строки
Разработать Delphi-приложение, в котором: С клавиатуры вводится и запоминается в массиве ...

Из каждой строки текстового файла выделить первые два слова и записать их в отдельный файл
Добрый день! Помогите пожалуйста в решении простенькой задачки, второй день мучаюсь... ( Нужно из...

Написать программу, которая читает первые три символа из каждой строки текстового файла
Написать программу, которая читает первые три символа из каждой строки текстового файла stroki.txt

Как из одной строки выделить три числа
Подскажите пожалуйсто. Как числа разделеные пробеллами 1233 456427 75789 применить к переменым...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru