首页 > 解决方案 > 从 CSV 文件加载 2D 矢量(73x74496 数据大小)

问题描述

我想读取数据只是数字的csv文件,数据的大小是(73x74496),我想将数据加载到代码中的向量样本中,如下所示。我想制作 sample[73][74496] 向量。之后,我将使用 sample[73][74496] 进行信号处理。但是,我无法将 csv 文件的数据加载到 sample[73][74496] 向量。你可以帮帮我吗?

int main()
{
    //float data[38][27];
    double** data = new double[73][74496];
    std::ifstream file("NAimg_20101026_145727.csv");

    for (int row = 0; row < 73; ++row)
    {
        std::string line;
        std::getline(file, line);
        if (!file.good())
            break;

        std::stringstream iss(line);

        for (int col = 0; col < 74496; ++col)
        {
            std::string val;
            std::getline(iss, val, ',');
            if (!iss.good())
                break;

            std::stringstream convertor(val);
            convertor >> data[row][col];
        }
    }
    std::cout << data[1][1] << std::endl;
    return 0;
}

标签: c++arrayscsvvector

解决方案


您可以重新定义它如何std::ifstream解释逗号,但说它们也只是空格。一旦完成,其余的就很容易就位了。

#include <cassert>
#include <fstream>
#include <iostream>
#include <iterator>
#include <locale>
#include <vector>

namespace
{
struct CommaIsWhitespaceToo : std::ctype<char>
{
   static auto makeTable()
   {
      static std::vector<mask> v(classic_table(), classic_table() + table_size);
      v[','] |= space;
      return v.data();
   }
   CommaIsWhitespaceToo() : ctype(makeTable()) {}
};
}  // namespace

int main()
{
   int const kRows = 73;
   int const kCol  = 74496;
   std::vector<double> data;
   data.reserve(kRows * kCol);
   std::ifstream file("NAimg_20101026_145727.csv");
   file.imbue(std::locale(file.getloc(), new CommaIsWhitespaceToo));
   data.assign(
      std::istream_iterator<double>(file), std::istream_iterator<double>());
   assert(data.size() == kRows * kCol);  // Just make sure we got them all. Not
                                         // too many and not too few
   std::cout << data[(1 * kCol) + 1] << std::endl;
   return 0;
}

data类型使用访问的替代主体[]可以像这样完成:

int main()
{
   constexpr int kRows = 73;
   constexpr int kCol  = 74496;

   using Row  = std::array<double, kCol>;
   using My2D = std::array<Row, kRows>;

   My2D data;
   std::ifstream file("NAimg_20101026_145727.csv");
   file.imbue(std::locale(file.getloc(), new CommaIsWhitespaceToo));
   for(auto& row : data)
      for(auto& col : row)
         file >> col;
   std::cout << data[1][1] << std::endl;
   return 0;
}

推荐阅读