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();
}
そして、データはこの2つの機能で保存されます。
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 の最初の行から 1 つの値を選択してみましょう。 pop_back を使用する場合、最初にインポートするときに両端キューを埋めるときに push_back を使用して後ろから値をプッシュしたことを考慮すると、これは機能する可能性があります。 0から始まるから pop_back(23) みたいなの?元のファイルの行 1、列 24 に対応する値を提供しますか?
参考までに、ファイル内でデータがどのように編成されているかを示すスナップショットを次に示します。