可以使用QMap
#include <QApplication>
#include <QFile>
#include <QDebug>
#include <QStringList>
#include <QMap>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 读取a.json文件,获取Analysis子节点的个数和每个子节点的TimePeriod字段;
QFile file("a.json");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return -1;
QByteArray data = file.readAll();
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(data, &error);
if (doc.isNull())
return -1;
QMap<QString, double> timePeriods; // 记录每个JobSetting对应的TimePeriod
int groupCount = 0; // 分组数量
QJsonObject rootObj = doc.object();
if (rootObj.contains("Analysis") && rootObj["Analysis"].isObject()) {
QJsonObject analysisObj = rootObj["Analysis"].toObject();
for (const QString &key : analysisObj.keys()) {
QJsonValue value = analysisObj[key];
if (value.isObject()) {
QJsonObject jobSettingObj = value.toObject();
if (jobSettingObj.contains("Parameter") && jobSettingObj["Parameter"].isObject()) {
double timePeriod = jobSettingObj["Parameter"].toObject()["TimePeriod"].toDouble();
timePeriods.insert(key, timePeriod);
groupCount++;
}
}
}
}
// 读取b.txt文件,并根据上一步获取的分组规则进行分组
QFile file2("b.txt");
if (!file2.open(QIODevice::ReadOnly | QIODevice::Text))
return -1;
QStringList lines = QString(file2.readAll()).split('\n', Qt::SkipEmptyParts);
int lineCount = lines.count();
QMap<QString, QVector<double>> groups; // 分组后的数据
int index = 0;
for (int i = 0; i < groupCount && index < lineCount; i++) {
QString key = "step-" + QString::number(i+1);
double timePeriod = timePeriods.value("JobSetting" + QString::number(i+1));
QVector<double> values;
while (values.count() < static_cast<int>(timePeriod) && index < lineCount) {
QStringList tokens = lines[index].split(' ', Qt::SkipEmptyParts);
for (const QString &token : tokens) {
values.append(token.toDouble());
if (values.count() == static_cast<int>(timePeriod)) { // 达到一个分组的长度,保存并清空
groups.insert(key, values.mid(1)); // 不包含第一个数0
values.clear();
break;
}
}
index++;
}
}
// 输出每个分组的名称和数据索引
for (const QString &key : groups.keys()) {
qDebug() << key << ":" << groups.value(key).toList();
}
return a.exec();
}
其中,使用while循环来读取文件中的数据,并根据时间段将其加入对应的向量中。注意,我们将每个向量从第二个数开始保存,因为b.txt文件中第一个数为0。