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 的相关文章

  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • 使用 Python 将列名称与 CSV 文件中的数据对齐

    这是我用来将数据写入 csv 文件的代码 with open temp csv a as fp a csv writer fp delimiter t data faceXpos faceYpos faceHeight faceWidth
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • 如何使用 zend 导入 CSV

    如何使用 zend 框架导入 CSV 文件 我应该使用 zend file transfer 还是有任何我必须研究的特殊类 另外 如果我使用 zend file transfer 是否有任何特殊的 CSV 验证器 你不必使用任何 zend
  • QTextEdit.find() 在 Python 中不起作用

    演示问题的简单代码 usr bin env python import sys from PyQt4 QtCore import QObject SIGNAL from PyQt4 QtGui import QApplication QTe
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • CodedUI 测试不从 CSV 输入文件读取数据

    我在使用编码 UI 测试方法映射 CSV 文件时遇到困难 这很可能是一个愚蠢的问题 但我似乎找不到解决我的问题的方法 至少没有一个有效的方法 我已确保将 CSV 文件的属性设置为始终复制 我还通过在测试方法上方写入以下行来导入 CSV 文件
  • 使用 Visual Studio 2013 构建 Qt 5.2.1 的静态版本

    几天来我一直在尝试使用 Visual Studio 2013 构建 Qt 的静态版本 我就是不明白我做错了什么 System Windows 7 64 位 Visual Studio 2013 仍安装 Visual Studio 2012
  • 使用 pandas 将字符串对象转换为 int/float

    import pandas as pd path1 home supertramp Desktop 100 life 180 data csv mydf pd read csv path1 numcigar Never 0 1 5 Ciga
  • 在rails中,如何将记录作为csv文件返回

    我有一个名为 Entries 的简单数据库表 class CreateEntries lt ActiveRecord Migration def self up create table entries do t t string firs
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 批量插入不适用于 NULL 数据

    当我从 CSV 文件将批量数据插入到表中时 它不起作用 显示错误 第 2 行第 9 列的批量加载数据转换错误 类型不匹配或指定代码页的字符无效 csv 文件中的第 9 列值为空 我该如何处理这个问题 根据这些信息 我认为目标表的特定字段被定
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • QT从QTableWidgetItem继承到Widget并覆盖'<'运算符

    我想要一个QTableWidget具有定制的某些单元QProgressBars 并且我希望能够对包含这些的列进行排序 我的定制QProgressBar继承自两者QProgressBar and QTableWidgetItem 并且我正在覆
  • Qt 5.6 测试版 Visual Studio 2015

    我已经安装了这个 http download qt io development releases qt 5 6 5 6 0 beta qt opensource windows x86 msvc2015 5 6 0 beta exe mi
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 下载 csv 文件 node.js

    我正在使用 node js 构建一个应用程序并尝试将数据下载为 csv 文件 我正在使用 json2csv https www npmjs com package json2csv https www npmjs com package j
  • Qt 是否已经有了自己的 new 和 delete 运算符?

    我正在使用一个QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem 这意味着要拨打很多电话new addItem 当出现时 并且removeItem delete摆脱未使用的点 当然 对于性能问题 我已经实
  • QSerialPort 中的 readAll() 不包括最后发送的响应

    我正在使用 Qt 来控制串行设备 如果我向串行设备发送命令 我会执行类似的操作serial gt write command r n 我制作了一个按钮 它将纯文本小部件内的文本更改为串行端口的响应 为了获得串口的响应 我使用serial g

随机推荐