Qt中读取csv文件的三种主要方法

 更新时间:2026年01月28日 09:23:25   作者:SunkingYang  
本文介绍了在Qt中读取CSV文件的三种主要方法:基础方法(QFile+QTextStream)、模型法(QStandardItemModel)和数据库法(QSqlDatabase),基础方法适合直接处理数据,模型法便于界面展示,数据库法则适用于复杂查询,文章提供了详细的代码示例,需要的朋友可以参考下

在Qt中读取CSV文件,主要思路是使用Qt的文件操作和字符串处理类来解析这种纯文本格式。下面是一个快速对比不同方法的表格,以及详细的代码示例和注意事项。

读取方法概览

方法核心思路适用场景优势
基础方法 (QFile + QTextStream)逐行读取,使用 split 按逗号分割字符串。数据量不大,无需界面显示,直接进行逻辑处理。简单直观,代码量少。
模型法 (QStandardItemModel)将数据读入数据模型,可直接绑定到QTableView等视图组件。需要在图形界面(如表格)中展示和编辑数据。与Qt的Model/View架构无缝集成,便于显示。
数据库法 (QSqlDatabase)将CSV文件作为数据源导入,使用SQL语句进行查询操作。需要进行复杂的数据查询、筛选或与数据库交互。可利用SQL强大查询能力。

基础方法:直接读取与处理

这是最常用和灵活的方法,适合在内存中直接操作数据。

#include <QFile>
#include <QTextStream>
#include <QStringList>
#include <QDebug>

// 读取CSV文件函数
bool readCsv(const QString &filePath, QList<QStringList>> &data) {
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "无法打开文件:" << filePath;
        return false;
    }

    QTextStream in(&file);
    // 设置编码,通常为UTF-8
    in.setEncoding(QStringConverter::Utf8);

    while (!in.atEnd()) {
        QString line = in.readLine().trimmed(); // 读取一行并去除首尾空白
        if (line.isEmpty()) continue; // 跳过空行

        // 使用逗号分割字符串,得到一行的数据列表
        QStringList row = line.split(',', Qt::SkipEmptyParts);
        data.append(row);
    }

    file.close();
    return true;
}

// 使用示例
int main() {
    QList<QStringList>> csvData;
    if (readCsv("data.csv", csvData)) {
        for (int i = 0; i < csvData.size(); ++i) {
            QStringList row = csvData.at(i);
            qDebug() << "第" << i << "行:" << row;
            // 进一步处理每个单元格的数据,例如转换为数字
            // double value = row.at(0).toDouble();
        }
    }
    return 0;
}

模型法:在界面表格中显示

如果你希望将CSV数据直接显示在Qt的表格视图(如QTableView)中,使用QStandardItemModel非常方便。

#include <QStandardItemModel>
#include <QTableView>

// 读取CSV文件到数据模型
QStandardItemModel* readCsvToModel(const QString &filePath) {
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        return nullptr;
    }

    QStandardItemModel *model = new QStandardItemModel;
    QTextStream in(&file);
    in.setEncoding(QStringConverter::Utf8);

    int row = 0;
    while (!in.atEnd()) {
        QString line = in.readLine();
        if (line.isEmpty()) continue;

        QStringList cellList = line.split(',', Qt::SkipEmptyParts);
        for (int col = 0; col < cellList.size(); ++col) {
            QString cell = cellList.at(col).trimmed();
            QStandardItem *item = new QStandardItem(cell);
            model->setItem(row, col, item);
        }
        row++;
    }
    file.close();
    return model;
}

// 在窗口类中使用示例
// 假设有一个QTableView控件指针 ui->tableView
void MainWindow::loadCsvFile() {
    QStandardItemModel *model = readCsvToModel("data.csv");
    if (model) {
        ui->tableView->setModel(model);
    }
}

重要注意事项

在实际使用中,还需要注意以下几点:

  1. 编码问题:CSV文件可能有不同的字符编码(如UTF-8, GBK)。如果出现乱码,需要使用QTextStream::setEncoding指定正确的编码,或使用QTextCodec进行转换。
  2. 数据有效性:从CSV读取的每个单元格数据都是QString类型。如果需要数值,应使用toInt(), toDouble()等方法转换,并检查是否成功。
  3. 大文件处理:对于非常大的CSV文件,一次性读取所有内容可能占用过多内存。可以考虑逐行读取并即时处理,而不是全部加载到QList或模型中。
  4. 格式复杂性:上面的简单split(',')方法适用于标准CSV。但如果数据内本身包含逗号或换行符(通常会用引号括起来),这种解析就不准确了。处理这种复杂情况需要更完善的解析逻辑。

希望这些信息能帮助你顺利在Qt中实现CSV文件的读取。如果你对特定场景或更复杂的数据处理有进一步的问题,我很乐意提供更多建议。

到此这篇关于Qt中读取csv文件的三种主要方法的文章就介绍到这了,更多相关Qt读取csv文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C/C++中四种常用查找算法的实现

    C/C++中四种常用查找算法的实现

    C语言作为一种强大的编程语言,提供了多种搜索算法的实现方式,本文将介绍C语言中的四种常见搜索算法并提供每种算法的简单实现示例,需要的小伙伴可以参考下
    2023-11-11
  • C++使用正则表达式的详细教程

    C++使用正则表达式的详细教程

    正则表达式是一个非常强大的工具,主要用于字符串匹配,下面这篇文章主要给大家介绍了关于C++使用正则表达式的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • C++中引用、内联函数、auto关键字和范围for循环详解

    C++中引用、内联函数、auto关键字和范围for循环详解

    本文主要梳理了C++当中一些琐碎的知识点,包括有命名空间,缺省参数,引用,auto关键字和内联函数,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • C++11 <future>中std::promise 介绍

    C++11 <future>中std::promise 介绍

    这篇文章主要介绍了C++11 <future>中std::promise 介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Qt在vs2019中使用及设置方法

    Qt在vs2019中使用及设置方法

    这篇文章主要介绍了Qt在vs2019中使用及设置方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • c语言指针数组的具体使用

    c语言指针数组的具体使用

    指针数组就是存放指针变量的数组,指针数组的本质是数组,而非指针,本文主要介绍了c语言指针数组的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • C语言入门篇--初识C语言及数据类型

    C语言入门篇--初识C语言及数据类型

    本篇文章是c语言基础篇,主要为大家介绍了C语言的基本类型,为大家介绍了什么是C语言,希望可以帮助大家快速入门c语言的世界,更好的理解c语言
    2021-08-08
  • C++ TinyXML解析案例详解

    C++ TinyXML解析案例详解

    这篇文章主要介绍了C++ TinyXML解析案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C语言 基本语法示例讲解

    C语言 基本语法示例讲解

    本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下
    2016-08-08
  • C++实现LeetCode(2.两个数字相加)

    C++实现LeetCode(2.两个数字相加)

    这篇文章主要介绍了C++实现LeetCode(两个数字相加),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论