0

CSV ファイルを読み取るプログラムを作成しようとしています (エスケープについて心配する必要はありません。引用符なしで厳密にフォーマットされています) が、値が 0 の数値項目は空白のままです。したがって、通常の行は次のようになります。

12,string1,string2,3,,,string3,4.5

それ以外の

12,string1,string2,3,0,0,string3,4.5

ベクトルを使用した作業コードがいくつかありますが、遅すぎます。

int main(int argc, char** argv)
{
    string filename("path\\to\\file.csv");
    string outname("path\\to\\outfile.csv");

    ifstream infile(filename.c_str());
    if(!infile) 
    {
      cerr << "Couldn't open file " << filename.c_str();
      return 1;
    }

    vector<vector<string>> records;
    string line;
    while( getline(infile, line) )
    {
        vector<string> row;
        string item;
        istringstream ss(line);
        while(getline(ss, item, ','))
        {
            row.push_back(item);
        }
        records.push_back(row);
    }

    return 0;
}

C++ を使用して .csv ファイルを読み取り、別の形式で出力する方法と同様に、ostream の operator<< をオーバーロードすることは可能ですか? フィールドを空白にできるのはいつですか? それはパフォーマンスを改善しますか?

または、これをより高速に実行するために他にできることはありますか? ありがとう

4

2 に答える 2

2

ファイルからの文字列データの読み取りに費やされた時間は、その解析に費やされた時間よりも長くなります。文字列の解析にかかる時間を大幅に節約することはできません。

プログラムをより高速に実行するには、より大きな「チャンク」をメモリに読み込みます。読み取りごとにより多くのデータを取得します。メモリ マップド ファイルの研究。

于 2013-10-16T13:05:53.170 に答える
1

これを処理してパフォーマンスを向上させる別の方法の 1 つは、ファイル全体をバッファーに読み込むことです。次に、バッファーを調べて、値が開始する場所へのポインターを設定します。

例: https://code.google.com/p/csv-routine/

于 2013-10-16T13:05:10.600 に答える