Qt读写csv文件

第一种办法:使用QStringList及QTextStream实现CSV文件读写

适用于:对于小型数据量的CSV文件

优点:

  1. 实现简单:使用QStringList和QTextStream实现CSV读写操作非常简单,能够快速上手;
  2. 代码量少:相对其他实现方式,该方法实现的代码量较少。

缺点:

  1. 写入数据顺序不能改变
  2. 当数据量大的时候,使用该方法逐行写入文件,文件I/O开销相对较大,导致写入速度变慢。
  3. 同时,该实现方式要求数据顺序不能改变,因为每行数据只存储在单独的QStringList中。

//读取CSV文件

先使用readLine读取每行数据,再使用split进行分割,得到QStringList 数据。

bool readCsv(QString filePath, QList<QStringList>& data)
{
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return false;

    QTextStream stream(&file);
    while (!stream.atEnd())
    {
        QString line = stream.readLine();
        QStringList row = line.split(',', Qt::SkipEmptyParts);
        data.append(row);
    }

    file.close();
    return true;
}

/写入CSV文件

使用<<运算符进行写操作,并写入分隔符“,”和换行符“\n”。

bool writeCsv(QString filePath, QList<QStringList>& data)
{
    QFile file(filePath);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
        return false;

    QTextStream stream(&file);
    for (int i = 0; i < data.size(); i++)
    {
        QStringList row = data.at(i);
        for (int j = 0; j < row.size(); j++)
        {
            stream << row.at(j);
            if (j < row.size() - 1)
                stream << ",";
        }
        stream << "\n";
    }

    file.close();
    return true;
}

第二种办法:使用QTextCodec及QByteArray实现CSV文件读写

本方法使用QTextCodec来处理编码问题,并使用QByteArray来读写文件

适用于大数据量。

优点:

  1. 适用性广泛:该实现方式适用性广泛,可以处理各种不同的字符编码
  2. 写入速度快:使用QByteArray类来读写文件,文件I/O开销相对较少。

缺点:

实现复杂:相对于第一种实现方式,该方法需要处理编码问题和字节流转换问题,因此实现方式相对复杂一些。

/读取CSV文件

直接使用readAll一次性读取整个csv文件,先按换行符“\n”进行分割,再按分隔符“,”进行分割。同时注意文件编码,使用UTF-8

bool readCsv(QString filePath, QList<QStringList>& data)
{
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly))
        return false;

    QTextCodec* codec = QTextCodec::codecForName("UTF-8");   // 使用UTF-8编码
    QByteArray content = file.readAll();
    QString text = codec->toUnicode(content);
    QStringList lines = text.split('\n');

    for (int i = 0; i < lines.size(); i++)
    {
        if (!lines.at(i).isEmpty())
        {
            QStringList row = lines.at(i).split(',');
            data.append(row);
        }
    }

    file.close();
    return true;
}

/写入CSV文件

使用join函数把QStringList加上分隔符“,”合并成 QString.再加上换行符“\n” .

使用write函数进行写操作。

bool writeCsv(QString filePath, QList<QStringList>& data)
{
    QFile file(filePath);
    if (!file.open(QIODevice::WriteOnly))
        return false;
    QTextCodec* codec = QTextCodec::codecForName("UTF-8");   // 使用UTF-8编码
    for (int i = 0; i < data.size(); i++)
    {
        QStringList row = data.at(i);
        QString line = row.join(",");
        line += "\n";
        QByteArray encodedLine = codec->fromUnicode(line);
        file.write(encodedLine);
    }
    file.close();
    return true;
}

  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值