Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Aleksei от Декабрь 15, 2016, 22:42



Название: Из текста найти слова и цифры заполнить ими lineEdit
Отправлено: Aleksei от Декабрь 15, 2016, 22:42
Здравствуйте!
Нужна помощь в написании простой программки.
Имеется текст созданный другой прогой. Пример текста:
Мука: 1.002.550
Рис: 3.062.550
Пшено: 110
и т.д.

Хотел сделать самым простым и понятным для всех способом, но не нашёл как это сделать. т.е. я так понимаю забить весь текст в матрицу и перемещать курсор и проверять символ М+у+к+а, если истина то переместить курсор до начала цифры после найденного слова и вывести значение в lineEdit=1.002.550 потом убрать все точки чтобы не мешало считать итого.
И так для каждого слова делать поиск.

Нашёл способ через QString.
Делаю поиск слова Мука
Код:
void MainWindow::on_pushButton_clicked()
{
    QString s1;
    s1 = ui->textEdit->toPlainText();
    int n=0,k=0;
    QRegExp rx("\\b(Мука)\\b");
    n = s1.indexOf (rx); //индекс
    k = s1.count(rx);   // кол-во
    if (n == -1) ui->lineEdit->setText("Не найдено");
     else ui->lineEdit->setText(QString::number(n));  // выводит индекс найденного слова. Не знаю пригодится ли мне это
     ui->lineEdit_2->setText(QString::number(k)); // сколько раз встречается слово. Типа для проверки ошибки в тексте.
}
как lineEdit поместить значения?
s1.remove("."); // удаляет все точки


Название: Re: Из текста найти слова и цифры заполнить ими lineEdit
Отправлено: qate от Декабрь 15, 2016, 23:06
понаписал ничего не понятно
убери точки и двоеточия - вот твой ответ, на твой вопрос )


Название: Re: Из текста найти слова и цифры заполнить ими lineEdit
Отправлено: kambala от Декабрь 15, 2016, 23:48
если я правильно понял задачу, надо из каждой строки вытащить число без точек. например, вот 2 способа:
0) предварительно разбить весь текст на строки
1) найти число с помощью регулярки QRegExp rx("\\d[\\d.]*"), отрезать из него точки через rx.cap(0).remove(".");
2) банально пройтись по строке циклом и построить новую строку из чисел:
Код
C++ (Qt)
QString number;
for (int i = 0; i < line.length(); ++i)
   if (line.at(i).isDigit())
       number += line.at(i);


Название: Re: Из текста найти слова и цифры заполнить ими lineEdit
Отправлено: Aleksei от Декабрь 16, 2016, 00:25
если я правильно понял задачу, надо из каждой строки вытащить число без точек. например, вот 2 способа:
0) предварительно разбить весь текст на строки
1) найти число с помощью регулярки QRegExp rx("\\d[\\d.]*"), отрезать из него точки через rx.cap(0).remove(".");
2) банально пройтись по строке циклом и построить новую строку из чисел:
Код
C++ (Qt)
QString number;
for (int i = 0; i < line.length(); ++i)
   if (line.at(i).isDigit())
       number += line.at(i);

Вот примерно то что искал. А зачем разбивать текст на строки? он ведь и так имеет строки с наименованием товара.
Только надо расставить в свои edit`ы.  1 edit  Мука:   2edit  Кол-во
и так на 6 наименований.    


Название: Re: Из текста найти слова и цифры заполнить ими lineEdit
Отправлено: kambala от Декабрь 16, 2016, 01:50
насколько я понял, ui->textEdit содержит в себе весь этот текст
Цитировать
Мука: 1.002.550
Рис: 3.062.550
Пшено: 110
но надо ж каждую строчку отдельно рассматривать


Название: Re: Из текста найти слова и цифры заполнить ими lineEdit
Отправлено: Aleksei от Декабрь 16, 2016, 09:44
Код:
QStringList line = s1.split('\n'); //разбил на строки
ui->editkolstr->setText(QString::number(line.size())); //кол-во строк

Ругается на .isDigit  
Цитировать
bool QChar::isDigit () const
Returns true if the character is a decimal digit (Number_DecimalDigit); otherwise returns false.
Передвигаюсь по строкам
Код:
for (int i=0; i<=line.size();i++)

        for (int j = 0; j < line.length(); ++j)
в строке ищу слово Мука либо только цифры, выдаёт все строки. В чём ошибка?


Название: Re: Из текста найти слова и цифры заполнить ими lineEdit
Отправлено: kambala от Декабрь 16, 2016, 17:21
< line.size(), а не <=. Хотя непонятно зачем нужен двойной цикл.

Ругается на .isDigit — как именно?

В чём ошибка? — без кода непонятно.


Название: Re: Из текста найти слова и цифры заполнить ими lineEdit
Отправлено: Aleksei от Декабрь 16, 2016, 17:56
если делаю < line.size() то одну строку не считает, хотя с рабоче программой нужно будет проверить.
На сколько я понял в line хранится инфа по строчно. В первом цикле я перемещаюсь сверху вниз с первой строки line[0] до [максимума], а во втором я пробую перемещаться по строке слева на право и искать нужно слово и цифры.
Цитировать
2) банально пройтись по строке циклом и построить новую строку из чисел:
хотя пробовал и rx обрабатывать строку. 


Название: Re: Из текста найти слова и цифры заполнить ими lineEdit
Отправлено: kambala от Декабрь 16, 2016, 18:33
твой QStringList хранит строчки (например, один из элементов — «Мука: 1.002.550»), лучше обозвать эту переменную lines или lineList. А дальше ты проходишь по символам каждой строки.
Код
C++ (Qt)
QStringList lines = s1.split('\n');
for (int i=0; i < lines.size(); ++i)
{
   QString line = lines.at(i);
   for (int j = 0; j < line.length(); ++j)
   {
       QChar character = line.at(j);
       ...
   }
}
можно вообще без индексов обойтись используя range-based for из С++11 либо foreach/Q_FOREACH


Название: Re: Из текста найти слова и цифры заполнить ими lineEdit
Отправлено: Aleksei от Декабрь 17, 2016, 01:49
Спасибо этот вариант хорошо работает с цифрами.
Буду искать для себя более понятный метод поиска Слова. И обработку возможных ошибок: если в строке несколько элементов.
Мука: 5.062.550Рис: 5.062.550
Кукуруза: 1.000   Фасоль: 2


Название: Re: Из текста найти слова и цифры заполнить ими lineEdit
Отправлено: Aleksei от Январь 06, 2017, 23:23
Подскажите, проблема при поиске русских букв.
предупреждение: multi-character character constant [-Wmultichar]
             if (bukv == 'Рњ')   
                         ^
Код:
   
        QString line = lines.at(i);
        for (int j = 0; j < line.length(); ++j)
        {
            QChar bukv = line.at(j);
            if (bukv == 'М')  // ищу букву (русская М)
            ui->editmuk->setText(QString::number(j));
         }
с поиском английских букв работает


Название: Re: Из текста найти слова и цифры заполнить ими lineEdit
Отправлено: kambala от Январь 07, 2017, 00:27
можно попробовать
Код
C++ (Qt)
u8'М'
но наверное лучше QChar(<тут hex-код буквы М из таблицы юникода>)


Название: Re: Из текста найти слова и цифры заполнить ими lineEdit
Отправлено: Aleksei от Январь 10, 2017, 00:35
Нет так не работает. А без юникода никак?
Почему такие сложности?


Название: Re: Из текста найти слова и цифры заполнить ими lineEdit
Отправлено: kambala от Январь 11, 2017, 01:01
никак. так устроен юникод и QString/QChar.

для буквы М используй QChar(0x041C). http://www.fileformat.info/info/unicode/char/041c/index.htm