我正在尝试编写一个将 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 列对应的值吗?
为了提供帮助,以下是文件中数据组织方式的快照