导入CSV文件,编辑它,并使用修改后的值输出

时间:2014-09-08 16:36:25

标签: c++ excel csv deque file-import

我正在尝试编写一个程序,该程序将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列相对应的值?

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

1 个答案:

答案 0 :(得分:1)

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

或者最好:

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

甚至更好:从结构中获取加载和保存成员函数,并使用typedef vector<vector<float>> table_t - 不需要继承deque或vector或任何容器......事实上,通过继承一个类没有虚拟析构函数,你要求麻烦。你错过encapsulation

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