使用 Qt 获取 csv 文件中两行之间所有行

Get all lines between two specific lines in csv file using Qt

本文关键字:两行 之间 获取 Qt csv 文件 使用      更新时间:2023-10-16

我正在使用以下代码读取qt中的csv文件:

QStandardItemModel* readFile()
{
    QFile config_file(FILE_PATH);
    if (config_file.open(QIODevice::ReadOnly)) {
        int lineindex = 0;
        QTextStream in(&config_file);
        while (!in.atEnd()) {
            QString fileLine = in.readLine();
            QStringList lineToken = fileLine.split(",", QString::SkipEmptyParts);
            //ignore commented lines
            if(!fileLine.startsWith("#", Qt::CaseSensitive)){
                for (int j = 0; j < lineToken.size(); j++) {
                    QString value = lineToken.at(j);
                    QStandardItem *item = new QStandardItem(value);
                    fileContent->setItem(lineindex, j, item);
                }
                lineindex++;
            }
        }
        return fileContent;
        config_file.close();
    }
}

我的csv如下所示:

TYPE_ES, type_1
subtypes_1, a, b
subtypes_2, 1, 2,3
  subtype_3 1,3,4,5
TYPE_ES, type_2
subtypes_1, x, y
subtypes_2, 4,5,6
  subtype_3 1,3,4,5
TYPE_ES, type_3
subtypes_1, x, y
subtypes_2, 4,5,6
 subtype_3 1,3,4,5

我想阅读并保存csv中"TYPE_ES,type_1","TYPE_ES,type_2"之间以及"TYPE_ES,type_2","TYPE_ES,type_3"等之间的所有行。

为了从QstandardItemModel访问元素,我使用以下方法:

QStringList listDeviceData;
if(fileContent->rowCount() > 0)
{
    for (int row = 0; row < fileContent->rowCount(); row++)
    {
        for (int col = 0; col < fileContent->columnCount(); col++)
        {
            QModelIndex index = fileContent->index(row,col,QModelIndex());
            listDeviceData.append(deviceData->data(index).toString());
        }
        }
    }   
 }

此方法允许我一次只检索一列的元素。但是,如果我要像上面提到的那样获取一组行,我如何解析 QStandardItemModel 并实现这一点?

可能是

这样的:

void readFile(QVector<QStringList>& vectorOfStrings)
{
    QFile config_file(FILE_PATH);
    if (config_file.open(QIODevice::ReadOnly)) {
        QTextStream in(&config_file);
        while (!in.atEnd()) {
            QString fileLine = in.readLine();
            QStringList lineToken = fileLine.split(",", QString::SkipEmptyParts);
            //ignore commented lines
            if(!fileLine.startsWith("#", Qt::CaseSensitive)){
                for (int j = 0; j < lineToken.size(); j++) {
                    QString value = lineToken.at(j);
                    if(j == 0 && value == "TYPE_ES"){
                        vectorOfStrings.append(QStringList());
                        break;
                    }
                    if(vectorOfStrings.count() > 0)
                        vectorOfStrings[vectorOfStrings.count() - 1].append(value);
                }
            }
        }
        config_file.close();
    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);    
    QVector<QStringList> vectorOfStrings;
    readFile(vectorOfStrings);
    return a.exec();
}

您可以获得带有"TYPE_ES"的行之间的所有行。