我正在尝试编写一个程序,该程序将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列相对应的值?
为了提供帮助,以下是文件中数据组织方式的快照
答案 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加载到容器中,并在需要时节省时间。