Qt环境下读取csv数据进行矩阵运算
1. 读取csv数据
csv.h头文件
#ifndef CSV_H
#define CSV_H
#include <QString>
#include <QTextStream>
#include <QStringList>
#include <QList>
#include <QFile>
class CSVParser{
private:
QList<QStringList> csvLines;
QString seperator;
public:
CSVParser();
CSVParser(QString sep);
QList<QStringList> read(QString filename);
int write(QString filename, QList<QStringList> lines);
};
#endif // CSV_H
csv.cpp源程序 #include "csv.h"
CSVParser::CSVParser(){
this->seperator = QString(",");
}
CSVParser::CSVParser(QString sep){
this->seperator = sep;
}
QList<QStringList> CSVParser::read(QString filename){
QFile file(filename);
QString line;
if(file.open(QFile::QIODevice::ReadOnly)){
QTextStream stream(&file);
while(!stream.atEnd()){
line = stream.readLine();
this->csvLines.append(line.split(this->seperator));
}
file.close();
}
return this->csvLines;
}
int CSVParser::write(QString filename, QList<QStringList> lines){
QFile file(filename);
QStringList line;
if(file.open(QFile::QIODevice::WriteOnly)){
QTextStream stream(&file);
for(int i=0;i<lines.size();i++){
line = lines[i];
stream << line.join(this->seperator)<<"\n";
}
file.close();
return 1;
}
return 0;
}
2. 使用矩阵运算库Eigen 在Qt环境中使用这个线性代数库,要在qmake中添加:
INCLUDEPATH += D:\Qt-libs\eigen
完整qmake:
QT += core
QT -= gui
CONFIG += c++11
TARGET = csv-mat-mult
CONFIG += console
CONFIG -= app_bundle
INCLUDEPATH += D:\Qt-libs\eigen
TEMPLATE = app
SOURCES += main.cpp \
csv.cpp
HEADERS += \
csv.h
主程序main.cpp为:
#include <iostream>
#include "csv.h"
#include <Eigen/Eigen>
int main()
{
QString filename("aa.csv");
CSVParser csvp(QString(","));
QList<QStringList> lines;
std::string str;
const char* s;
lines = csvp.read(filename);
int m = lines.size();
if(m!=0){
int n = lines[0].size();
if(n!=0){
Eigen::MatrixXf mat(m,n);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
str = lines[i][j].toStdString();
s = str.c_str();
mat(i,j) = atof(s);
}
}
std::cout<<"mat = " <<std::endl<< mat<<std::endl;
std::cout<<"mat*mat = " <<std::endl<< mat*mat<<std::endl;
}
}
return 0;
}