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

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

将存储的值的结构是一个2Dvector,因为它允许大文件。

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(); } 

现在, 在输出数据之前我试图创build一个函数,它接收来自特定列 (第24,25和48列和49列,因为它是Excel格式的csv文件 – 行和列)中的值,并执行若干计算。 实质上,我需要能够访问特定的值。

让我们尝试从第24列的第一行中select一个值。如果我使用pop_back ,这可能会起作用,因为在首先导入时,我使用push_back从后面推入值。 它是从什么样的pop_back(23),因为它从0开始? 它会提供与原始文件中第1行,第24列相对应的值吗?

为了帮助,这里是数据如何在文件中组织的快照 原始的csv文件

在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 – 不需要inheritancedeque,vector或任何容器…实际上,通过inheritance一个类没有虚拟的析构函数,你是在惹麻烦。 而你在封装上失踪。

如果保存和加载是免费的模板function,它可以加载CSV和容器,并节省您的时间,如果你需要它。