qt — c ++ найти текст в QStringList, который начинается с & quot; … & quot; используя .indexOf

У меня есть вопрос относительно QStringList:

У меня есть .txt-файл, содержащий несколько 1000 строк данных, а затем:

+-------------------------+-------------------+-----------------------|
|  Conditions at          |      X1           |     X2                |
+-------------------------+-------------------+-----------------------|
|  Time [ms]              |   0.10780E-02     |     0.27636E-02       |
|  Travel [m]             |   0.11366E+00     |     0.18796E+01       |
|  Velocity [m/s]         |   0.43980E+03     |     0.13920E+04       |
|  Acceleration [g]       |   0.11543E+06     |     0.20936E+05       |
…

Где Заголовок (Условия в …) и первый столбец (Поездка, Время, …) всегда остаются неизменными, но значения меняются для каждого прогона. Из этого файла я хочу прочитать значения (только!) В поля графического интерфейса.
Сначала я записываю все данные в QStringList. (Каждая строка .txt копируется в один элемент QStringList)

Чтобы получить значения, из QStringList я попытался найти соответствующие строки с «.индекс()«который не сработал, потому что я должен попросить точный текст вся линия. Так как значения меняются, строки отличаются для каждого прогона, и моя программа не может найти соответствующие строки.

Есть ли команда типа «.indexOf-Начиная с определенного текста”, Который нашел бы меня линии начало с определенным текстом, например «| Время [мс]

большое спасибо

itelly

1

Решение

Да, есть метод «.indexOf-Начиная с определенного текста». Вы можете использовать регулярные выражения, чтобы соответствовать началу строки:

 int QStringList::indexOf (const QRegExp& rx, int from = 0) const

Используйте это так:

int timeLineIndex = stringList.indexOf(QRegExp("^\|  Time \[ms\].+"));

^ означает, что этот текст должен быть в начале строки
\ избегает специальных символов
.+ означает, что любой текст может следовать за этим

РЕДАКТИРОВАТЬ:
Вот рабочий пример, который показывает, как это работает:

QStringList stringList;
stringList << "abc 5234 hjd";
stringList << "bnd|gf dfs aaa";
stringList << "das gf dfs aaa";
int index = stringList.indexOf(QRegExp("^bnd\|gf.+"));
qDebug() << index;

Выход: 1

РЕДАКТИРОВАТЬ:

Вот функция для ezee использования этого:

int indexOfLineStartingWith(const QStringList& list, const QString& textToFind)
{
return list.indexOf(QRegExp("^" + QRegExp::escape(textToFind) + ".+"));
}

int index = indexOfLineStartingWith(stringList, "bnd|gf");  //it's not needed to escape characters here
2

Другие решения

Прежде всего ваши фактические данные начинаются со строки 4 (исключая заголовок). Второе — каждая строка данных имеет определенный макет, который вы можете анализировать. Предполагая, что вы прочитали весь файл в QStringList, где каждый элемент в списке представляет каждую строку, вы можете сделать следующее:

QStringList data;
[..]
for (int i = 3; i < data.size(); i++) {
const QString &line = data.at(i);

// Parse the X1 and X2 columns' values
QString strX1 = line.section('|', 1, 1, QString::SectionSkipEmpty).trimmed();
QString strX2 = line.section('|', 2, 2, QString::SectionSkipEmpty).trimmed();
}
1

По вопросам рекламы [email protected]