c++ - 从 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;
}
解决方案
您可以重新定义它如何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;
}
推荐阅读
- animation - Flutter 屏幕右下角的按钮
- dart - 无法加载内核二进制文件 (Dart SDK dev.69.4)
- excel-formula - 2张excel公式帮助
- android - 为什么在尝试注入 Conext 时会出现此错误?
- arrays - Excel公式搜索多个字符串之一并返回字符串
- javascript - 将键和值映射到 Javascript 中的新键
- javascript - 获取所有选中的复选框 javascript 或 jquery
- kotlin - 如何在特定点暂停协程
- python - Kprototype 算法元组索引超出范围
- angular - 在元素通过 ngIf 出现后对其进行聚焦