使用Qt获取csv文件中两个特定行之间的所有行
Get all lines between two specific lines in csv file using Qt
我正在使用以下代码在 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" 行之间的所有行。
我正在使用以下代码在 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" 行之间的所有行。