Qt 笔记4--Qt 读写CSV

2023-11-18

Qt 笔记4--Qt 读写CSV

 

CSV(Comma-Separated Values),即逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号,其文件以纯文本形式存储表格数据;CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。Qt中似乎没有直接处理CSV的类,因此需要按照CSV的格式进行解析和生成,以下为笔者根据需要写的一个CSV读写案例,后续有相关功能函数也会在此处加以补充。

 

1、源代码

CSV不同行之间使用 \n 符隔开,行内各列之间使用 , 隔开,根据该原则:读取的时候,只需读取所有文本,逐行读出,每一行去除  \n 和 , 即可;生成的时候,将各字段依次放到字符串中,并用 , 隔开,然后在末尾添加 \n 换行符,最后将字符串依次以附加的形式写到文本中即可。
该案例源代码包括三个主要文件:csvclass.h、csvclass.cpp、main.cpp,源码如下:

csvclass.h

#ifndef CSVCLASS_H
#define CSVCLASS_H

#include <QDebug>
#include <QFile>
class CsvClass
{
public:
    CsvClass();
    QList<QStringList> ReadFromCSV(QString PathName);
    void SaveToCSV(QList<QStringList> CsvList,QString PathName);
};

#endif // CSVCLASS_H

csvclass.cpp

#include "csvclass.h"

CsvClass::CsvClass()
{
    qDebug()<<"This is CSV exapmle!\n";
}

QList<QStringList>  CsvClass::ReadFromCSV(QString PathName)
{
    QList<QStringList> retList;
    qDebug().noquote()<<"Original CSV name:"<<PathName;
    QFile file(PathName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return retList;
    while (!file.atEnd()) {
        //QByteArray line = file.readLine();
        QString line = file.readLine();
        line.replace('\n',"");//delete \n symbol
        QStringList lineList = line.split(',');
        retList.append(lineList);
        qDebug().noquote()<<lineList;
    }
    file.close();
    return retList;
}

void CsvClass::SaveToCSV(QList<QStringList> CsvList,QString PathName)
{
    qDebug().noquote()<<"\nDestination CSV name:"<<PathName;
    for(int i=0;i<CsvList.size();i++)
    {
        QString tmpStr;
        QStringList strList = CsvList.at(i);
        for(int j=0;j<strList.size();j++){
            tmpStr.append(strList.at(j));
            if(j<(strList.size()-1)){
                tmpStr.append(',');
            }else{
                tmpStr.append('\n');
            }
        }
        qDebug().noquote()<<i<<'\t'<<tmpStr;
        QFile file(PathName);
        if(!file.open(QIODevice::WriteOnly| QIODevice::Text | QIODevice::Append)){
            qDebug()<<"Open "<<PathName<<" Error!";
            return;
        }else{
            QTextStream in(&file);
            in<<tmpStr;
            file.close();
        }
    }
}

main.cpp

#include <QCoreApplication>
#include <csvclass.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    CsvClass *CsvObj = new CsvClass();
    QList<QStringList> retList = CsvObj->ReadFromCSV("Data.csv");
    CsvObj->SaveToCSV(retList,"Data_w.csv");
    delete CsvObj;
    return a.exec();
}

2、测试结果

以下为此时CSV原始内容:

ymd,power,irradiation,bWendu,yWendu,bTianqi,yTianqi,fengli,aqi,aqiInfo,aqiLevel,sunny_percent,rain_percent,rain_full,pressure_avg,hum_avg,tem_max,tem_min,tem_avg,wspd_avg
20160401,-1,,27,19,阴,多云,3,77,良,,65,0,0,1006.91,78.91,26.9,20.6,22.87,1.08
20160402,-1,,26,20,阴,,3,66,良,,25,29,0,1007.96,83.79,25.8,20.4,22.42,1.34
20160403,-1,,26,19,雷阵雨,,3,51,良,,0,83,0,1007,81.92,27.8,20.7,23.59,1.39
20160404,-1,,25,21,阵雨,,3,38,优,,33,66,22.8,1004.96,85.92,28,20.2,23.44,1.35
20160405,-1,,27,20,多云,,3,34,优,,100,0,0,1005.79,87.42,26,20,22.95,1.4
20160406,-1,,27,20,阴,,3,29,优,,50,33,0,1005.62,79.29,29.8,21.4,24.68,1.56
20160407,-1,,29,22,多云,,3,34,优,,58,41,0,1005.62,82.58,28.8,22.6,25.18,1.49
20160408,-1,,27,21,小雨,,3,39,优,,83,16,0,1005.75,83,29.3,22.8,25.57,1.73
20160409,-1,,28,21,小雨,,3,37,优,,25,75,0.1,1004.12,87.79,27.1,23.5,25.08,1.82
20160410,-1,,26,21,中雨,小到中雨,4,35,优,,0,100,11,1001.75,91.58,24.6,21.2,22.96,1.41

测试输出结果如下:

This is CSV exapmle!

Original CSV name: Data.csv
(ymd, power, irradiation, bWendu, yWendu, bTianqi, yTianqi, fengli, aqi, aqiInfo, aqiLevel, sunny_percent, rain_percent, rain_full, pressure_avg, hum_avg, tem_max, tem_min, tem_avg, wspd_avg)
(20160401, -1, , 27, 19, 阴, 多云, 3, 77, 良, , 65, 0, 0, 1006.91, 78.91, 26.9, 20.6, 22.87, 1.08)
(20160402, -1, , 26, 20, 阴, , 3, 66, 良, , 25, 29, 0, 1007.96, 83.79, 25.8, 20.4, 22.42, 1.34)
(20160403, -1, , 26, 19, 雷阵雨, , 3, 51, 良, , 0, 83, 0, 1007, 81.92, 27.8, 20.7, 23.59, 1.39)
(20160404, -1, , 25, 21, 阵雨, , 3, 38, 优, , 33, 66, 22.8, 1004.96, 85.92, 28, 20.2, 23.44, 1.35)
(20160405, -1, , 27, 20, 多云, , 3, 34, 优, , 100, 0, 0, 1005.79, 87.42, 26, 20, 22.95, 1.4)
(20160406, -1, , 27, 20, 阴, , 3, 29, 优, , 50, 33, 0, 1005.62, 79.29, 29.8, 21.4, 24.68, 1.56)
(20160407, -1, , 29, 22, 多云, , 3, 34, 优, , 58, 41, 0, 1005.62, 82.58, 28.8, 22.6, 25.18, 1.49)
(20160408, -1, , 27, 21, 小雨, , 3, 39, 优, , 83, 16, 0, 1005.75, 83, 29.3, 22.8, 25.57, 1.73)
(20160409, -1, , 28, 21, 小雨, , 3, 37, 优, , 25, 75, 0.1, 1004.12, 87.79, 27.1, 23.5, 25.08, 1.82)
(20160410, -1, , 26, 21, 中雨, 小到中雨, 4, 35, 优, , 0, 100, 11, 1001.75, 91.58, 24.6, 21.2, 22.96, 1.41)

Destination CSV name: Data_w.csv
0        ymd,power,irradiation,bWendu,yWendu,bTianqi,yTianqi,fengli,aqi,aqiInfo,aqiLevel,sunny_percent,rain_percent,rain_full,pressure_avg,hum_avg,tem_max,tem_min,tem_avg,wspd_avg

1        20160401,-1,,27,19,阴,多云,3,77,良,,65,0,0,1006.91,78.91,26.9,20.6,22.87,1.08

2        20160402,-1,,26,20,阴,,3,66,良,,25,29,0,1007.96,83.79,25.8,20.4,22.42,1.34

3        20160403,-1,,26,19,雷阵雨,,3,51,良,,0,83,0,1007,81.92,27.8,20.7,23.59,1.39

4        20160404,-1,,25,21,阵雨,,3,38,优,,33,66,22.8,1004.96,85.92,28,20.2,23.44,1.35

5        20160405,-1,,27,20,多云,,3,34,优,,100,0,0,1005.79,87.42,26,20,22.95,1.4

6        20160406,-1,,27,20,阴,,3,29,优,,50,33,0,1005.62,79.29,29.8,21.4,24.68,1.56

7        20160407,-1,,29,22,多云,,3,34,优,,58,41,0,1005.62,82.58,28.8,22.6,25.18,1.49

8        20160408,-1,,27,21,小雨,,3,39,优,,83,16,0,1005.75,83,29.3,22.8,25.57,1.73

9        20160409,-1,,28,21,小雨,,3,37,优,,25,75,0.1,1004.12,87.79,27.1,23.5,25.08,1.82

10       20160410,-1,,26,21,中雨,小到中雨,4,35,优,,0,100,11,1001.75,91.58,24.6,21.2,22.96,1.41

3、说明

以上代码默认测试环境为Qt 5.7,测试系统为Windows7 x64

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 笔记4--Qt 读写CSV 的相关文章

  • 第一次信号发射后自动断开

    我正在从文件加载网页 然后替换其中的一些 html self template web page QtWebKit QWebPage self template web page mainFrame load QtCore QUrl tem
  • Qt 为什么使用 QString::number() 而不是 QLocale().toString()?

    我正在开发的应用程序将在许多国家推出 并且需要支持他们的语言 我一直在回顾我的代码并替换以下每个实例 QString number and QString toDouble with QLocale toString and QLocale
  • QMainWindow 上的 Qt 布局

    我设计了一个QMainWindow with QtCreator s设计师 它由默认的中央小部件 aQWidget 其中包含一个QVBoxLayout以及其中的所有其他小部件 现在我想要的一切就是QVBoxLayout自动占据整个中央小部件
  • 从逗号分隔的字符串中删除项目[重复]

    这个问题在这里已经有答案了 假设我有一个字符串 cat mouse dog horse 是否有正则表达式或函数可以按如下方式工作 1 cat return string gt mouse dog horse 2 mouse return s
  • OpenCV 机器学习算法的 CSV 格式

    OpenCV 中的机器学习算法似乎使用以 CSV 格式读取的数据 参见示例这个 cpp文件 https code ros org trac opencv browser trunk opencv samples c tree engine
  • QML 中可重用的字体属性[重复]

    这个问题在这里已经有答案了 在 QML 中 我希望能够定义一组字体属性以进行简单的语义重用 例如 代替 Text text This is a header font family Encode Sans weight Font Black
  • CSV.foreach 未读取 CSV 文件中的第一列

    第一次学习Ruby来自动清理一些CSV文件 我已经设法从其他 SO 问题中拼凑出下面的脚本 但由于某种原因 该脚本没有读取原始 CSV 文件的第一列 如果我添加一个虚拟的第一列 一切都会完美运行 我缺少什么 require csv COLU
  • 如何在针对 Windows XP 的情况下使用 VS2012 构建 Qt 4/5?

    我正在尝试使用 Visual Studio 2012 构建 Qt 4 8 5 Qt 5 2 1 针对 Windows XP SDK v7 1a 使用 VS2102 编译时 源代码与 SDK v7 1a 存在各种不兼容性 因此无法开箱即用 这
  • 将 jstring 转换为 QString

    我正在调用一个返回字符串的 Java 函数 QAndroidJniObject obj QAndroidJniObject callStaticObjectMethod
  • 解析 Google 表格中制表符分隔的文本文件

    我在网上有一个 txt 文件 其中包含制表符分隔值 TSV CSV 如下所示 产品IDtabColortabPricetabQuantity项目1tabRed tab 5 2 tab5项目2tabBlue tab 7 5 tab10 我使用
  • QTableView 并双击一个单元格

    我正在开发测试用例编辑器 该编辑器包含 USART 传输和接收数据包格式 编辑器是一个表格视图 发送和接收数据包的长度为八个字节 例如 0x01 0x02 0x03 0x08 它在我的第五和第六栏中 现在 我希望此列中的单元格为只读 但是当
  • CSV 提供的数据源第一列中存在奇数字符

    我有一个 CSV 文件 已添加到 Visual Studio 单元测试项目中 它有七列 如下所示 assessmentitemid reviewer1 reviewer2 reviewer3 reviewer4 reviewer5 revi
  • PyQt4 QPalette 不工作

    btn QtGui QPushButton Button self palettes btn palette palettes setColor btn backgroundRole QtCore Qt green btn setPalet
  • 如何在 Qt 应用程序中嵌入 Python 解释器?

    有没有一种简单的方法可以将 Python 解释器嵌入到 Qt 应用程序中 如果可能的话 我希望有一个跨平台的解决方案 这就是目的PythonQt http pythonqt sourceforge net 它支持 Windows Linux
  • 如何在 T-SQL 中将 CSV 转换为记录集?

    在我的存储过程中 我传递一个过滤器 使用 WHERE Column IN 子句 作为参数 参数值以 CSV 形式给出 将此 CSV 转换为记录集的最佳方法是什么 例子 SELECT FROM Employee WHERE Name IN J
  • Spark SQL如何读取压缩的csv文件?

    我尝试过使用apispark read csv读取带有扩展名的压缩 csv 文件bz or gzip 有效 但在源代码中我没有找到任何可以声明的选项参数codec type 即使在这个link https github com databr
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m
  • QFileSystemModel setRootPath

    我正在尝试创建一个 Qt 应用程序来显示文件夹 Mac OS 中的 Users 文件夹 的内容 这是代码 QFileSystemModel dirModel new QFileSystemModel dirModel gt setRootP
  • Qt(在 Windows 上)将权限级别设置为“requireAdministrator”

    我正在使用 Qt Creator 并努力制作 exe文件默认以管理员身份运行 在线阅读所有解决方案我试图将这一行放入我的 pro file QMAKE LFLAGS MANIFESTUAC level requireAdministrato
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List

随机推荐