#include "QtGuiApplication4.h"
#include "qDebug"
#include"qDebug"
#include<QTimer>
#include<QTime>
#include<qdir.h>
#include<qmessagebox.h>
#include<qsettings.h>
#include<QFileDialog>
#include<vector>
#include<QStringlist>
#include<QString>
#include<string>
using namespace::std;
QtGuiApplication4::QtGuiApplication4(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
Initial_function();
}
void QtGuiApplication4::Initial_function()
{
connect(ui.pushButton_readData, SIGNAL(clicked()), this, SLOT(Read_CSV_data()));
connect(ui.pushButton_clearData, SIGNAL(clicked()), this, SLOT(Clear_text_data()));
}
bool QtGuiApplication4::Read_CSV_data()
{
int rows;
int columns;
Read_CSV_data_file(readData, &rows, &columns); // 读取数据
for (int i = 1; i < columns; i++)
{
for (int j = 0; j < rows; j++)
{
ui.textEdit_show->append("readData[" + QString::number(i) + "][" +
QString::number(j) + "]= " + QString::number((readData[i][j]).toDouble())); //显示
}
}
// 选择计算方式
QStringList Last_result_data;
switch (ui.comboBox_Method->currentIndex())
{
case 0:
Last_result_sort(&readData[0], &readData[1], &Last_result_data); //以纯数字方式
for (int k = 0; k < Last_result_data.size(); k++)
{
ui.textEdit_show->append("Last_result_data[" + QString::number(k) + "]= " +
QString::number((Last_result_data[k]).toDouble())); //显示
}
break;
case 1:
Last_result_sort_Method2(&readData[0], &readData[1], &Last_result_data);
for (int k = 0; k < Last_result_data.size(); k++)
{
ui.textEdit_show->append("Last_result_data[" + QString::number(k) + "]= " +
QString::number((Last_result_data[k]).toDouble())); //显示
}
break;
default:
break;
}
return true;
}
bool QtGuiApplication4::Clear_text_data()
{
ui.textEdit_show->clear(); //清空内容
return true;
}
// 文件读取,自选文件
bool QtGuiApplication4::Read_CSV_data_file(QStringList *readData, int *NUMrows, int *NUMcolumns)
{
/****************************文 件 读 取**********************************************/
//**选择不同路径文档CSV/Txt文件,并读取其中的数值
//**此过程是手动选择需要读取的文件,并返回数据的行数和列数
QString curPath = QDir::currentPath(); //获取当前应用程序的目录
QString dlgTitle = "选择一个文件"; //
QString filter = "CSV文件(*.csv);;文本文件(*.txt)"; //文件过滤器(选择不同后缀的文件)
QString fileName = QFileDialog::getOpenFileName(this, dlgTitle, curPath, filter); //返回带路径的完整文件名
QFile csvFile(fileName);
QStringList CSVList;
// 打开文件//必须需要的步骤
if (!csvFile.open(QIODevice::ReadOnly))
{
QMessageBox::warning(this, "Error Message", QStringLiteral("文件不存在,打开失败!")); //提示窗口
return false;
}
// 读取数据
QTextStream stream(&csvFile);
while (!stream.atEnd()) //读取到最后一行
{
CSVList.push_back(stream.readLine()); //读取所有行数据,并push_back到一起
}
csvFile.close(); // 关闭文件
QStringList oneLineData = CSVList[0].split(","); //数据分割
for (size_t k = 0; k < oneLineData.size(); k++)
{
readData[k].clear();
}
// 将数据转化为[列][行]
for (size_t i = 0; i < CSVList.size(); i++)
{
QStringList oneLine = CSVList[i].split(",");
for (size_t j = 0; j < oneLine.size(); j++)
{
readData[j] << oneLine[j]; //读取每一行的所有数据;
}
*NUMcolumns = oneLine.size(); //读取数据列数
}
*NUMrows = CSVList.size(); //读取数据行数
return true;
}
/******************************************************************************************/
//******************* 方法一******************
// 将结果按照需要的顺序输出
//******前提是第一列为纯数字 如 1 , 2.......***************//
void QtGuiApplication4::Last_result_sort(QStringList *source,QStringList *result, QStringList *sort_result)
{
int temp;
for (int i = 0; i < (*source).size(); i++)
{
temp = (*source)[i].toDouble()-1; //下标从 0 开始 // 注意地方
*sort_result << (*result)[temp];
}
}
//********************方法 二 *******************
// 将结果按照需要的顺序输出
//******第一列为 字母+数字 如P1 ,P2,....... ***************//
void QtGuiApplication4::Last_result_sort_Method2(QStringList *source, QStringList *result, QStringList *sort_result)
{
// 将P1,P2.......,P10......Pn,中的第一个字母去掉,只保留后面的数字
QStringList number_last;
QStringList Last_result;
QString temp;
for (int i = 0; i < (source[0]).size(); i++)
{
number_last << source[0][i].split(','); // 分裂之后,还是以一列存放;
for (int j = 0; j < number_last[0].size() - 1; j++)
{
qDebug() << "Last_result==" << number_last[0][j + 1] << endl; //从每个字符串,第二个字符开始打印。
temp[j] = number_last[0][j + 1]; //赋值给字符串
}
Last_result.append(temp); //压到一起
number_last.clear(); // 必须要的清空
temp.clear(); // 必须要的清空
}
// 将保留的转化为数值
double Last_result_value;
for (int k = 0; k < Last_result.size(); k++)
{
Last_result_value = Last_result[k].toDouble()-1; //此时数值为对应下标 //下表从0 开始
// 寻找需要序列的数值
*sort_result << (*result)[Last_result_value]; //最终输出数值
}
}