0

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 に対応する値を提供しますか?

参考までに、ファイル内でデータがどのように編成されているかを示すスナップショットを次に示します。 元の csv ファイル

4

1 に答える 1

1

std::deque に pop_back(int) のようなものはありません... 24 列目の最初のセルにアクセスするために (*this)[0][23] と書きます - 最初のインデックスは行インデックスです、行全体を両端キューの両端キューにプッシュしたため、2 番目のインデックスは列インデックスです。

またはできれば:

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

またはさらに良い: 構造体から load および save メンバー関数を取得して使用しますtypedef vector<vector<float>> table_t。deque、vector、またはコンテナーを継承する必要はありません...実際、仮想デストラクタのないクラスを継承することで、あなたは求めていますトラブルのために。そして、あなたはカプセル化に欠けています。

save と load が無料のテンプレート化された関数である場合、CSV をコンテナーにロードして、必要に応じて時間を節約することができます。

于 2014-09-08T17:48:53.743 に答える