0

我正在尝试编写一个将 CSV 文件作为输入的程序,以便我可以修改(执行计算)存在的值并输出它,再次以 CSV 格式和新值输出。

将存储值的结构是 2D 向量,因为它允许大文件。

struct data_t: deque <deque <float> >
{
  typedef deque <deque <float> > ::iterator record_iterator;
  typedef deque        <float>   ::iterator field_iterator;
  bool load( const string& filename );
  bool save( const string& filename );
  bool save( ostream& outs );
};

数据通过 getline 加载。

bool data_t::load( const string& filename )
{
  string s;
  ifstream f( filename.c_str() );
  while (getline( f, s ))
  {
    deque <float> record;
    istringstream iss( s );
    while (getline( iss, s, ',' ))
    {
      float fieldvalue = 0.0f;
      istringstream( s ) >> fieldvalue;
      record.push_back( fieldvalue );
    }
    this->push_back( record );
  }
  return f.good();
}

并通过这两个功能保存数据。

bool data_t::save( const string& filename )
{
  ofstream f( filename.c_str() );
  if (!f) return false;

  return save( f );
}

bool data_t::save( ostream& outs )
{
  for (data_t::record_iterator ri = this->begin(); ri != this->end(); ri++)
  {
    for (data_t::field_iterator fi = ri->begin(); fi != ri->end(); fi++)
      outs << ((fi == ri->begin()) ? "" : ", ") << *fi;
    outs << endl;
  }
  return outs.good();
}

现在,在我输出数据之前我正在尝试创建一个函数,该函数从特定列(列 24、25 和 48 以及 49,因为它是 excel 格式的 csv 文件 - 行和列)获取值并执行多个计算。本质上,我需要能够访问特定的值。

让我们尝试从第 24 列的第一行中选择一个值。如果我使用pop_back,考虑到我在首先导入时填充双端队列时使用 push_back 从后面推入值,这可能会起作用。 是否类似于 pop_back(23),因为它从 0 开始?这会提供与原始文件中第 1 行第 24 列对应的值吗?

为了提供帮助,以下是文件中数据组织方式的快照 原始csv文件

4

1 回答 1

1

std::deque... 中没有 pop_back(int) 之类的东西来访问您要编写的第 24 列的第一个单元格 (*this)[0][23] - 第一个索引是行索引,因为您将一整行推入双端队列,而第二个索引是列索引。

或者最好:

data_t table;
table.load("bla.csv");
//process table[0][23]
//...

甚至更好:从结构中获取加载和保存成员函数,并使用typedef vector<vector<float>> table_t- 不需要继承双端队列或向量或任何容器......事实上,通过继承一个没有虚拟析构函数的类,你在问为了麻烦。而且您缺少封装

如果保存和加载是免费的模板化功能,则可以将 CSV 加载到容器中,并在需要时为您节省时间。

于 2014-09-08T17:48:53.743 回答