Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何读取CSV文件并分配给特征矩阵?_C++_Csv_Matrix_Eigen - Fatal编程技术网

C++ 如何读取CSV文件并分配给特征矩阵?

C++ 如何读取CSV文件并分配给特征矩阵?,c++,csv,matrix,eigen,C++,Csv,Matrix,Eigen,我尝试将一个大型cvs文件读入特征矩阵,在代码下方发现有问题,无法检测cvs文件中的每一行\n以在矩阵中创建多行。(它用一行读取整个文件)。不确定代码出了什么问题。有人能推荐一下吗? 我也在寻找一种有效的方法来读取包含10k行和1k列的csv文件。不确定下面的代码是否是最好的有效方法?非常感谢您的评论 #include <stdio.h> #include <stdlib.h> #include <iostream> #include <fstream&

我尝试将一个大型cvs文件读入特征矩阵,在代码下方发现有问题,无法检测cvs文件中的每一行\n以在矩阵中创建多行。(它用一行读取整个文件)。不确定代码出了什么问题。有人能推荐一下吗? 我也在寻找一种有效的方法来读取包含10k行和1k列的csv文件。不确定下面的代码是否是最好的有效方法?非常感谢您的评论

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <istream> //DataFile.fail()  function
#include <vector>
#include <set>
#include <string>
using namespace std;


#include <Eigen/Core>
#include <Eigen/Dense>
using namespace Eigen;

 void readCSV(istream &input, vector< vector<string> > &output)
{
    int a = 0;
    int b = 0;

    string csvLine;
    // read every line from the stream
    while( std::getline(input, csvLine) )
    {

        istringstream csvStream(csvLine);
        vector<string> csvColumn;
        MatrixXd mv;
        string csvElement;
        // read every element from the line that is seperated by commas
        // and put it into the vector or strings
        while( getline(csvStream, csvElement, ' ') )
        {
            csvColumn.push_back(csvElement);
            //mv.push_back(csvElement);
            b++;
        }       
        output.push_back(csvColumn);
        a++;
    }
    cout << "a : " << a << " b : " << b << endl;   //a doen't detect '\n'
}

int main(int argc, char* argv[])
{

    cout<< "ELM" << endl;
    //Testing to load dataset from file.
    fstream file("Sample3.csv", ios::in);
    if(!file.is_open())
    {
        cout << "File not found!\n";
        return 1;
    }
    MatrixXd m(3,1000);
    // typedef to save typing for the following object
    typedef vector< vector<string> > csvVector;
    csvVector csvData;

    readCSV(file, csvData);
    // print out read data to prove reading worked
    for(csvVector::iterator i = csvData.begin(); i != csvData.end(); ++i)
    {
        for(vector<string>::iterator j = i->begin(); j != i->end(); ++j)
        {
           m(i,j) = *j; 
           cout << *j << ", ";
        }
        cout << "\n";
    }
}
#包括
#包括
#包括
#包括
#include//DataFile.fail()函数
#包括
#包括
#包括
使用名称空间std;
#包括
#包括
使用名称空间特征;
void readCSV(istream&input,vector&output)
{
int a=0;
int b=0;
弦线;
//从小溪里读每一行
while(std::getline(输入,csvLine))
{
istringstream csvStream(csvLine);
向量CSV柱;
MatrixD mv;
串级;
//从以逗号分隔的行中读取每个元素
//并将其放入向量或字符串中
while(getline(csvStream,csvElement,,))
{
CSV柱。推回(CSVELENT);
//中压推回(C级);
b++;
}       
输出。向后推(CSV列);
a++;
}

cout这将正确读取csv文件:

std::ifstream indata;

indata.open(filename);

std::string                line;
while (getline(indata, line))
{
    std::stringstream          lineStream(line);
    std::string                cell;

    while (std::getline(lineStream, cell, ','))
    {
        //Process cell
    }
}

编辑:此外,由于您的csv中充满了数字,因此,一旦您希望将其视为数字,请确保使用
std::stod
或等效的转换。

将csv文件读入您的
矢量
(如Lucas's)。使用
向量
或更简单的
向量
代替
向量
构造。要使用
向量
有效地将向量分配给特征矩阵,请使用以下方法:

Eigen::MatrixXcd mat(rows, cols);
for(int i = 0; i < rows; i++)
    mat.row(i) = Eigen::Map<Eigen::VectorXd> (csvData[i].data(), cols).cast<complex<double> >();
Eigen::MatrixXcd mat(行、列);
对于(int i=0;i
如果您选择使用
向量
选项,它将变为:

Eigen::MatrixXcd mat(rows, cols);
mat = Eigen::Map<Eigen::VectorXd> (csvData.data(), rows, cols).cast<complex<double> >().transpose();
Eigen::MatrixXcd mat(行、列);
mat=Eigen::Map(csvData.data(),rows,cols).cast().transpose();

这里有一些你可以复制粘贴的东西

编写自己的“解析器”

优点:轻便且可定制

#include <Eigen/Dense>
#include <vector>
#include <fstream>

using namespace Eigen;

template<typename M>
M load_csv (const std::string & path) {
    std::ifstream indata;
    indata.open(path);
    std::string line;
    std::vector<double> values;
    uint rows = 0;
    while (std::getline(indata, line)) {
        std::stringstream lineStream(line);
        std::string cell;
        while (std::getline(lineStream, cell, ',')) {
            values.push_back(std::stod(cell));
        }
        ++rows;
    }
    return Map<const Matrix<typename M::Scalar, M::RowsAtCompileTime, M::ColsAtCompileTime, RowMajor>>(values.data(), rows, values.size()/rows);
}
缺点:可自定义

#include <Eigen/Dense>
#include <vector>
#include <fstream>

using namespace Eigen;

template<typename M>
M load_csv (const std::string & path) {
    std::ifstream indata;
    indata.open(path);
    std::string line;
    std::vector<double> values;
    uint rows = 0;
    while (std::getline(indata, line)) {
        std::stringstream lineStream(line);
        std::string cell;
        while (std::getline(lineStream, cell, ',')) {
            values.push_back(std::stod(cell));
        }
        ++rows;
    }
    return Map<const Matrix<typename M::Scalar, M::RowsAtCompileTime, M::ColsAtCompileTime, RowMajor>>(values.data(), rows, values.size()/rows);
}
#包括
#包括
#包括
使用名称空间特征;
模板
M load_csv(常量标准::字符串和路径){
std::ifstream indata;
开放(路径);
std::字符串行;
std::向量值;
uint行=0;
while(std::getline(indata,line)){
std::stringstream lineStream(行);
字符串单元;
while(std::getline(lineStream,cell,,')){
值。推回(标准::stod(单元格));
}
++行;
}
返回映射(values.data()、rows、values.size()/行);
}
用法

MatrixXd A = load_csv<MatrixXd>("C:/Users/.../A.csv");
Matrix3d B = load_csv<Matrix3d>("C:/Users/.../B.csv");
VectorXd v = load_csv<VectorXd>("C:/Users/.../v.csv");
MatrixXd A=load_csv(“C:/Users/../A.csv”);
Matrix3d B=load_csv(“C:/Users/../B.csv”);
VectorXd v=load_csv(“C:/Users/../v.csv”);
使用犰狳库的解析器

优点:还支持其他格式,而不仅仅是csv

缺点:额外依赖性

#include <armadillo>

template <typename M>
M load_csv_arma (const std::string & path) {
    arma::mat X;
    X.load(path, arma::csv_ascii);
    return Eigen::Map<const M>(X.memptr(), X.n_rows, X.n_cols);
}
#包括
模板
M load_csv_arma(常量标准::字符串和路径){
arma::matx;
X.load(路径,arma::csv_ascii);
返回Eigen::Map(X.memptr(),X.n_行,X.n_列);
}

到目前为止,您的分隔符是空的:
。您的意思是:
,“
?嗨,卢卡斯,是的,我确实在我的第一个代码中尝试过,”,但这是因为它没有检测到我的cvs文件中每一行的行尾,所以我尝试使用它“”,但它似乎仍然失败。
m(i,j)=*j;
这是不正确的。
getline
应该处理换行符(除非csv的字段有换行符,而它们不应该有换行符)5gon12eder:是的,你是对的,它不正确。但是我该如何插入矩阵呢?我已经尝试了你的代码,我确实理解了你的评论。它现在似乎仍在基于cvs文件工作。不确定这里出了什么问题。我只想它每行可以计数1001列并读取3行。也许我应该再次检查。因为第二个while循环是ac实际循环cvs文件中的全部3行数据,我可以识别其中的每一行。这让我仍然感到困惑。尝试将我的代码与Avi Ginsburg的代码结合起来,您将得到一个有效的答案。不要弄乱分隔符(将
,'
更改为
'
),因为这不能满足您的要求。我们已经给了您答案,您需要做的只是在实现它方面做一些工作。祝您好运!也许我在这方面的知识有限。是的,我做了您的评论,代码仍然给我错误,我无法继续。这就是为什么我感谢Avi能提供更多提示。错误:mat=Map(csvData.data(),行,列)没有用于初始化映射的匹配构造函数。@D9268不是VectorXd,而是MatrixXd。本征对象是一个2D矩阵。为什么要构造该
std::vector
,而不直接将值存储在
eigent::matrix
?@5gon12eder如果在读取整个文件之前无法确定矩阵的大小,那么就很容易了r使用push_back并让容器处理大小调整。好的,我以为你建议创建一个
std::vector
,然后创建一个
std::vector
,最后创建一个
Eigen::MatrixXd
。两步过程似乎不错。@Avi Ginsburg,谢谢你的建议。但是,我尝试了你的想法,遇到了一个ereadCSV函数中的错误不支持push_back。也许您可以发布更多代码来说明我应该如何实现?Thanks@AviGinsburg:您的最后一行没有将行主格式(CSV)读入列主格式(Eigen)吗?如果我们知道t的大小,您知道该怎么办吗