QT实现CVS文件的读取、CVS内容转换、CVS文件保存、qt选择文件夹路径、多选文件

221 阅读1分钟

软件运行效果如下:
在这里插入图片描述
软件读取选中的所有csv文件,并逐个进行处理后,重新保存到制定路径下
主要代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::processCSV(QStringList strCSVPathList)
{
    for(int k = 0;k<strCSVPathList.count();k++)
    {
        QFile csvFile(strCSVPathList.at(k));
        QStringList CSVList;
        CSVList.clear();
        if (csvFile.open(QIODevice::ReadWrite))
        {
            QTextStream stream(&csvFile);
            while (!stream.atEnd())
            {
                CSVList.push_back(stream.readLine());
            }
            csvFile.close();
            int ncolumn,nrow,ncolumnOut,nrowOut;
            nrow = CSVList.size();
            nrowOut = nrow-2;
            ncolumn = 2;
            ncolumnOut = 3;
            if(!CSVList.empty())
            {
                QString strtemp = CSVList.first();
                QStringList qslisttemp = strtemp.split(",");
                double *dCsvData = new double[ncolumn*nrow];
                double *dCsvDataOut = new double[ncolumnOut*nrowOut];
                //由于ncolumn*nrow个double达到12M,不能放在栈上面,所以不能通过double dCsvData[ncolumn*nrow];的方式申请内存,只能通过new的方式在堆上面申请
                for(int i = 0;i<nrow;i++)
                {
                    QString str1 = CSVList.at(i);
                    QStringList qslist = str1.split(",");
                    for(int j = 0;j<ncolumn;j++)
                    {
                        if(qslist.count()>j)
                        {
                            dCsvData[i*ncolumn+j] = qslist.at(j).toDouble();
                        }
                    }
                    if(i>1)
                    {
                        dCsvDataOut[(i-2)*ncolumnOut+0] = 0;
                        dCsvDataOut[(i-2)*ncolumnOut+1] = (i-2)*0.002;
                        dCsvDataOut[(i-2)*ncolumnOut+2] = dCsvData[i*ncolumn+1]/1000;
                    }
                    //qDebug()<<dCsvData[i*ncolumn];//输出每一行的第一个数据
                }
                saveCSV(dCsvDataOut,ncolumnOut,nrowOut,k,mStrCSVPathList,mStrOutDir);
                qDebug() <<"ncolumn = "<<ncolumn<< "nrow = "<<nrow<<"\n";//输出csv文件的列和行数
            }
        }
        csvFile.close();
    }
}

void MainWindow::saveCSV(double *csvInfo,int nWidth,int nHeight,int nID,QStringList StrCSVPathList,QString  StrOutDir)
{
    QDir dir;
    dir.cd(StrOutDir);  //进入某文件夹
    QString strFilePath = StrCSVPathList.at(nID); //= strFilePath+ QString("Cloud%1.csv").arg(nID);
    int nIndex = strFilePath.lastIndexOf('/');//寻找‘.’符号在字符串中的id
    nIndex++;
    int nLen = strFilePath.length()-nIndex;
    QString FILE_NAME =strFilePath.right(nLen);
    nIndex = FILE_NAME.lastIndexOf('.');
    FILE_NAME = FILE_NAME.left(nIndex);
    QString FILE_PATH = StrOutDir+"//"+FILE_NAME+"_out.csv";
    QFile csvFile(FILE_PATH);
    QStringList CSVList;
    CSVList.clear();
    if (csvFile.open(QIODevice::ReadWrite))
    {
        QTextStream stream(&csvFile);
        for(int i=0;i<nHeight;i++)
       {
            for(int j=0;j<nWidth;j++)
            {
                stream<<csvInfo[nWidth*i+j]<<",";
            }
            stream<<"\n";
        }
    }
    csvFile.close();
}

void MainWindow::on_ButtonInFolder_clicked()//读取cvs文件
{
    QFileDialog *fileDlg = new QFileDialog(this);
    fileDlg->setWindowTitle("Choose CSV files");
    QStringList qstrFilters;
    qstrFilters<<"CSV files(*.csv)";
    qstrFilters<<"Any files (*)";
    fileDlg->setNameFilters(qstrFilters);//设置文件过滤器
    fileDlg->setFileMode(QFileDialog::ExistingFiles);//设置能选择多个文件,如果是单个文件就写成QFileDialog::ExistingFile
    if(fileDlg->exec() == QDialog::Accepted)
    {
        mStrCSVPathList = fileDlg->selectedFiles();
    }
    fileDlg->close();
    delete fileDlg;
    fileDlg = nullptr;
    ui->textEditInFolder->clear();
    for(int i = 0;i<mStrCSVPathList.count();i++)
    {
        ui->textEditInFolder->append(mStrCSVPathList.at(i));
    }
}

void MainWindow::on_ButtonOutFolder_clicked()//选择输出文件夹路径
{
    ui->textEditOutFolder->clear();
    mStrOutDir = QFileDialog::getExistingDirectory(this, tr("Open Directory"), "/home", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
    ui->textEditOutFolder->append(mStrOutDir);
}

void MainWindow::on_ButtonStartChaneCSV_clicked()//开始处理csv文件
{
    processCSV(mStrCSVPathList);
}