最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt讀寫CSV文件的三種方式及優(yōu)劣對(duì)比

 更新時(shí)間:2023年11月24日 11:30:47   作者:luoyayun361  
最近的要用到CSV格式的數(shù)據(jù),所以這篇文章講述一下QT讀取CSV文件數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Qt讀寫CSV文件的三種方式及優(yōu)劣對(duì)比的相關(guān)資料,需要的朋友可以參考下

前言

作為一種常見的數(shù)據(jù)交換格式,CSV(Comma Separated Values)文件常常用于數(shù)據(jù)導(dǎo)出和導(dǎo)入等場(chǎng)合。在實(shí)際開發(fā)中,我們也需要使用Qt來實(shí)現(xiàn)CSV文件的讀寫操作。本篇博客將介紹使用Qt實(shí)現(xiàn)CSV讀寫的方法,并分析每種實(shí)現(xiàn)方式的優(yōu)缺點(diǎn)。

一、使用QStringList及QTextStream實(shí)現(xiàn)CSV文件讀寫

本方法使用QStringList來保存每行數(shù)據(jù),使用QTextStream類讀寫文本文件。具體實(shí)現(xiàn)代碼如下:

// 讀取CSV文件
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文件
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;
}

該示例代碼運(yùn)用了QTextStream的readLine()和<<運(yùn)算符來實(shí)現(xiàn)CSV文件數(shù)據(jù)的讀寫。需要注意的是,在讀取CSV文件時(shí),要使用QStringList的split()函數(shù)來將每行拆分為多個(gè)字符串,并用字符串列表保存。在寫入CSV文件時(shí),要使用QStringList的join()函數(shù)來將每行數(shù)據(jù)轉(zhuǎn)為字符串,并用逗號(hào)分隔,產(chǎn)生一條CSV行,最后一行不應(yīng)該有逗號(hào)。

優(yōu)點(diǎn):

  • 實(shí)現(xiàn)簡單:使用QStringList和QTextStream實(shí)現(xiàn)CSV讀寫操作非常簡單,能夠快速上手;
  • 代碼量少:相對(duì)其他實(shí)現(xiàn)方式,該方法實(shí)現(xiàn)的代碼量較少。

缺點(diǎn):

  • 寫入數(shù)據(jù)順序不能改變:當(dāng)數(shù)據(jù)量大的時(shí)候,使用該方法逐行寫入文件,文件I/O開銷相對(duì)較大,導(dǎo)致寫入速度變慢。同時(shí),該實(shí)現(xiàn)方式要求數(shù)據(jù)順序不能改變,因?yàn)槊啃袛?shù)據(jù)只存儲(chǔ)在單獨(dú)的QStringList中。

二、使用QTextCodec及QByteArray實(shí)現(xiàn)CSV文件讀寫

本方法使用QTextCodec來處理編碼問題,并使用QByteArray來讀寫文件。具體實(shí)現(xiàn)如下:

// 讀取CSV文件
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文件
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;
}

該示例代碼在讀取CSV文件時(shí)使用了QTextCodec的codecForName()方法來指定文件編碼為UTF-8,使用QByteArray類保存文件數(shù)據(jù),通過QTextCodec::toUnicode()函數(shù)將字節(jié)數(shù)組轉(zhuǎn)換成QString對(duì)象。在寫入CSV文件時(shí),使用QByteArray類保存每行數(shù)據(jù),并將數(shù)據(jù)編碼成字節(jié)數(shù)組后寫入文件。

優(yōu)點(diǎn):

  • 適用性廣泛:該實(shí)現(xiàn)方式適用性廣泛,可以處理各種不同的字符編碼;
  • 寫入速度快:使用QByteArray類來讀寫文件,文件I/O開銷相對(duì)較少。

缺點(diǎn):

  • 實(shí)現(xiàn)復(fù)雜:相對(duì)于第一種實(shí)現(xiàn)方式,該方法需要處理編碼問題和字節(jié)流轉(zhuǎn)換問題,因此實(shí)現(xiàn)方式相對(duì)復(fù)雜一些。

三、使用QStandardItemModel實(shí)現(xiàn)CSV文件讀寫

本方法使用QStandardItemModel來保存每行數(shù)據(jù),并使用QTextStream來讀寫文件。具體實(shí)現(xiàn)如下:

// 讀取CSV文件
bool readCsv(QString filePath, QStandardItemModel* model)
{
    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);
        QList<QStandardItem*> items;
        for (int i = 0; i < row.size(); i++)
        {
            QStandardItem* item = new QStandardItem(row.at(i));
            items.append(item);
        }
        model->appendRow(items);
    }

    file.close();
    return true;
}

// 寫入CSV文件
bool writeCsv(QString filePath, QStandardItemModel* model)
{
    QFile file(filePath);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
        return false;

    QTextStream stream(&file);
    for (int i = 0; i < model->rowCount(); i++)
    {
        QStringList row;
        for (int j = 0; j < model->columnCount(); j++)
        {
            QString cell = model->index(i, j).data().toString();
            row.append(cell);
        }
        stream << row.join(",") << "\n";
    }

    file.close();
    return true;
}

該示例代碼使用了QStandardItemModel類來保存每行數(shù)據(jù),并使用QTextStream類讀寫文件。在讀取CSV文件時(shí),使用QStandardItemModel的appendRow()函數(shù)向模型中添加新行,并在每行中保存對(duì)應(yīng)的QStandardItem對(duì)象的指針。在寫入CSV文件時(shí),從QStandardItemModel中取出每個(gè)單元格的數(shù)據(jù),將其轉(zhuǎn)換成字符串后,保存到QStringList中,并使用QTextStream類的<<運(yùn)算符將數(shù)據(jù)寫入到文件中。

優(yōu)點(diǎn):

  • 具有更好的擴(kuò)展性:相對(duì)于前兩種實(shí)現(xiàn)方式,使用QStandardItemModel實(shí)現(xiàn)CSV讀寫操作具有更好的擴(kuò)展性和靈活性;
  • 數(shù)據(jù)順序可改變:使用QStandardItemModel保存數(shù)據(jù)可以方便地改變數(shù)據(jù)順序,并且可以添加自定義的數(shù)據(jù)項(xiàng)(例如:QComboBox)。

缺點(diǎn):

  • 實(shí)現(xiàn)相對(duì)復(fù)雜:相對(duì)于前兩種實(shí)現(xiàn)方式,使用QStandardItemModel實(shí)現(xiàn)CSV讀寫操作需要考慮到數(shù)據(jù)處理和模型層次結(jié)構(gòu)的復(fù)雜性;
  • 內(nèi)存消耗較大:使用QStandardItemModel來保存每行數(shù)據(jù),可能會(huì)導(dǎo)致內(nèi)存消耗較大。

附:QT讀取csv文件并且繪制折線圖

void MainWindow::readcsvfile() //讀取csv
{
 QFile csvFile("C:/Users/Administrator/Desktop/Demo/0702.CSV");
 QStringList csvList;
 csvList.clear();
 if (csvFile.open(QIODevice::ReadWrite)) //對(duì)csv文件進(jìn)行讀寫操作
 {
  QTextStream stream(&csvFile);
  while (!stream.atEnd())
 {
 csvList.push_back(stream.readLine()); //保存到List當(dāng)中
 }
 csvFile.close();
 }
 else
 {
	 QMessageBox::about(NULL, "csv文件", "未打開該文件!");
 }
   int i = 0;
   Q_FOREACH(QString str, csvList)   //遍歷List
  {
   i = i + 1;
   QStringList valsplit = str.split(","); //分隔字符串
   if(i > 2)
   {
    //得到深度、聲速、溫度
    QString depth = valsplit[0];
    QString sonicvelocity = valsplit[1];
    QString temperature = valsplit[2];
    double depthvalue = depth.toDouble();
    double sonicvalue = sonicvelocity.toDouble();
    double tempvalue = temperature.toDouble();
	//Q//MessageBox::warning(NULL, "dd", QString::number(tempvalue));
	QPointF point;
    point.setX(depthvalue);
    point.setY(sonicvalue);
	QPointF point2;
	point2.setX(depthvalue);
	point2.setY(tempvalue + 1510);
    vectors.append(point);
	vector2.append(point2);
   }
  }
}
 
void MainWindow::lineChart() //繪制圖
{
    //設(shè)置X,Y標(biāo)題
    ui->qwtPlot->setAxisTitle(QwtPlot::xBottom, QString::fromLocal8Bit("深度(m)"));
    ui->qwtPlot->setAxisTitle(QwtPlot::yLeft, QString::fromLocal8Bit("聲速(m/s)"));
    ui->qwtPlot->setAxisTitle(QwtPlot::yRight, QString::fromLocal8Bit("溫度(°C)"));
    ui->qwtPlot->enableAxis(QwtPlot::yRight,true);
    ui->qwtPlot->setAxisScale(QwtPlot::yLeft,1538,1540,0.2);
    ui->qwtPlot->setAxisScale(QwtPlot::xBottom,0,30,2);
    ui->qwtPlot->setAxisScale(QwtPlot::yRight,28,30,0.2);
 
	//ui->qwtPlot->set
    //構(gòu)造曲線數(shù)據(jù)
     QwtPointSeriesData* series = new QwtPointSeriesData(vectors);
	 //設(shè)置網(wǎng)格
	 QwtPlotGrid* grid = new QwtPlotGrid();
	 grid->setPen(QColor(222, 222, 222), 1);
	 grid->attach(ui->qwtPlot);
	 //create plot item
     QwtPlotCurve* curve1 = new QwtPlotCurve(QString::fromLocal8Bit("聲速"));
     //設(shè)置數(shù)據(jù)
	 curve1->setData(series);
	 //設(shè)置畫筆顏色==就是圖像顏色
	 curve1->setPen(QColor(255, 0, 0), 2, Qt::SolidLine);
	 //使曲線更光滑
	 curve1->setCurveAttribute(QwtPlotCurve::Fitted, true);
	 //把曲線附加到qwtPlot上
     curve1->attach(ui->qwtPlot);
     //添加溫度-深度曲線
	 //構(gòu)造曲線數(shù)據(jù)
	 QwtPointSeriesData* series2 = new QwtPointSeriesData(vector2);
	 //create plot item
	 QwtPlotCurve* curve2 = new QwtPlotCurve(QString::fromLocal8Bit("溫度"));
	 //設(shè)置數(shù)據(jù)
	 curve2->setData(series2);
	 //設(shè)置畫筆顏色=圖像顏色
	 curve2->setPen(QColor(127, 222, 335), 2, Qt::SolidLine);
	 //使曲線更光滑
	 curve2->setCurveAttribute(QwtPlotCurve::Fitted, true);
	 //把曲線附加到qwtPlot上
	 curve2->attach(ui->qwtPlot);
 
	 //設(shè)置圖例
	 QwtLegend *legend = new QwtLegend;
	 legend->setDefaultItemMode(QwtLegendData::ReadOnly);
	 ui->qwtPlot->insertLegend(legend,QwtPlot::BottomLegend);//插入圖例
	 ui->qwtPlot->replot();
     ui->qwtPlot->show();
}

需要第三方庫QWT

運(yùn)行結(jié)果:

最后

本篇博客介紹了四種使用Qt實(shí)現(xiàn)CSV文件讀寫操作的方法,分別是:

  • 使用QStringList及QTextStream實(shí)現(xiàn)CSV文件讀寫;
  • 使用QTextCodec及QByteArray實(shí)現(xiàn)CSV文件讀寫;
  • 使用QStandardItemModel實(shí)現(xiàn)CSV文件讀寫;

每種實(shí)現(xiàn)方式都有自己的優(yōu)缺點(diǎn),在實(shí)際開發(fā)中可以根據(jù)具體應(yīng)用場(chǎng)景選擇適用的實(shí)現(xiàn)方法。

總的來說,對(duì)于小型數(shù)據(jù)量的CSV文件,使用QStringList及QTextStream實(shí)現(xiàn)CSV文件讀寫是一個(gè)比較好的選擇,因?yàn)閷?shí)現(xiàn)相對(duì)簡單;對(duì)于大型數(shù)據(jù)量的CSV文件,使用QTextCodec及QByteArray可以更快地進(jìn)行文件I/O操作;使用QStandardItemModel可以更好地處理數(shù)據(jù)添加、刪除、排序等操作,但相對(duì)復(fù)雜一些。而對(duì)于使用頻率較高的CSV讀寫操作,可以考慮使用基于Qt的CSV庫或插件,這樣可以更快地實(shí)現(xiàn)CSV文件讀寫操作。

當(dāng)然,在實(shí)際開發(fā)中還涉及到其他問題,例如文件路徑的處理、文件打開失敗處理等,本文示例中并未全部涉及,可根據(jù)具體應(yīng)用場(chǎng)景進(jìn)行擴(kuò)展。

總結(jié)

到此這篇關(guān)于Qt讀寫CSV文件的三種方式及優(yōu)劣對(duì)比的文章就介紹到這了,更多相關(guān)Qt讀寫CSV文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++面向?qū)ο笾畬?duì)象的賦值詳解

    c++面向?qū)ο笾畬?duì)象的賦值詳解

    本文講解了C++中對(duì)象初始化、復(fù)制構(gòu)造函數(shù)及賦值操作的實(shí)現(xiàn)與優(yōu)化,通過Stack類的實(shí)例,展示了默認(rèn)賦值帶來的內(nèi)存泄漏問題,以及通過重載賦值運(yùn)算符解決該問題的過程,最后強(qiáng)調(diào)了使用explicit關(guān)鍵字以限制隱式構(gòu)造函數(shù)調(diào)用的重要性
    2026-05-05
  • C或C++報(bào)錯(cuò):ld returned 1 exit status報(bào)錯(cuò)的原因及解決方法

    C或C++報(bào)錯(cuò):ld returned 1 exit status報(bào)錯(cuò)的原因及解

    這篇文章主要介紹了C或C++報(bào)錯(cuò):ld returned 1 exit status報(bào)錯(cuò)的原因及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • C++實(shí)現(xiàn)四叉樹效果(附源碼下載)

    C++實(shí)現(xiàn)四叉樹效果(附源碼下載)

    這篇文章主要介紹了C++實(shí)現(xiàn)四叉樹效果(附源碼下載),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • C++中幾種將整數(shù)轉(zhuǎn)換成二進(jìn)制輸出的方法總結(jié)

    C++中幾種將整數(shù)轉(zhuǎn)換成二進(jìn)制輸出的方法總結(jié)

    下面小編就為大家?guī)硪黄狢++中幾種將整數(shù)轉(zhuǎn)換成二進(jìn)制輸出的方法總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • C++中防止頭文件重復(fù)包含的幾種方法

    C++中防止頭文件重復(fù)包含的幾種方法

    在 C/C++ 編程中,當(dāng)一個(gè)項(xiàng)目比較大時(shí),往往都是分文件,這時(shí)候有可能不小心把同一個(gè)頭文件 include 多次,或者頭文件嵌套包含,這些會(huì)導(dǎo)致一系列的問題,如符號(hào)重定義、編譯錯(cuò)誤等,因此,防止頭文件的重復(fù)包含是至關(guān)重要的,本文給大家介紹了C++中防止頭文件重復(fù)包含的兩種方法
    2024-05-05
  • C++歸并排序算法詳解

    C++歸并排序算法詳解

    大家好,本篇文章主要講的是C++歸并排序算法詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C語言繪制雷達(dá)圖的示例代碼

    C語言繪制雷達(dá)圖的示例代碼

    常用的統(tǒng)計(jì)圖有條形圖、柱形圖、折線圖、曲線圖、餅圖、環(huán)形圖、扇形圖,其中還有一種雷達(dá)圖的繪制也較難,本文為大家提供了雷達(dá)圖的繪制方法,需要的可以參考下
    2024-02-02
  • C++ const關(guān)鍵字分析詳解

    C++ const關(guān)鍵字分析詳解

    C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性。這篇文章主要介紹了C/C++ 中const關(guān)鍵字的用法,需要的朋友可以參考下
    2021-08-08
  • 最新評(píng)論

    阿勒泰市| 雷波县| 洪洞县| 绿春县| 灵武市| 武汉市| 邹城市| 从江县| 翁源县| 双柏县| 湖南省| 商都县| 通渭县| 高清| 华宁县| 桑植县| 吉林市| 专栏| 黄陵县| 金乡县| 霍林郭勒市| 屯昌县| 江都市| 方正县| 米脂县| 巢湖市| 平利县| 吉林省| 宁南县| 鹿泉市| 卢氏县| 赞皇县| 金溪县| 南华县| 河曲县| 武城县| 辽阳市| 阳朔县| 连平县| 鄂托克前旗| 白玉县|