2016-06-08 42 views
0

兩個特定的行之間的所有行,我用下面的代碼讀取QT csv文件:獲取csv文件使用Qt

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並實現此目標?

+0

如果您想要以「一串」或不同格式提取數據,則可能不應該使用QStandardItemModel,如果要在網格和樹中顯示數據並且希望輕鬆地進行操作,模型視圖體系結構非常棒,如果你想在組中使用數據,可以保持靈活性,也許你應該使用標準容器並按照你想要的方式存儲數據,從我理解的我將使用QMap >>或類似的東西。 – Marco

+0

QStringList @Marco – smyslov

回答

0

可能是這樣的:

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」。

+0

如何提前知道vectorOfStrings的大小以便將它傳遞給readFile是不可能的。我應該在函數本身中聲明它。但是在這裏我有一個關於vectorOfStrings的大小應該被聲明的問題。 – smyslov

+0

因爲vectorOfStrings是引用,所以在調用readFile之前不必知道vectorOfStrings的元素的確切數量。我添加了函數調用的示例。嘗試這個。 –

+0

我問這個,因爲我得到以下錯誤「斷言失敗QVector :: operator []:」索引超出範圍「」在此行vectorOfStrings [vectorOfStrings.count() - 1] .append(值);我認爲這是因爲我沒有聲明大小 – smyslov