У меня есть вопрос относительно 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
Да, есть метод «.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
Прежде всего ваши фактические данные начинаются со строки 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();
}