软件运行效果如下:
软件读取选中的所有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);
}