6x で構成される 100 万行を書き込む必要がある小さなエクスポート機能に取り組んでいますdoubles
。残念ながら、データを読み取るツールでは、ドットをカンマに置き換える必要があります。私が今それらを変換する方法は、エディターで手動で置き換えることです。これは面倒で、約 20MB のファイルの場合は非常に遅くなります。
書き込み中にこの変換を行う方法はありますか?
6x で構成される 100 万行を書き込む必要がある小さなエクスポート機能に取り組んでいますdoubles
。残念ながら、データを読み取るツールでは、ドットをカンマに置き換える必要があります。私が今それらを変換する方法は、エディターで手動で置き換えることです。これは面倒で、約 20MB のファイルの場合は非常に遅くなります。
書き込み中にこの変換を行う方法はありますか?
のようなツールを使用するtr
ことは、手動で行うよりも優れており、最初の選択肢となるはずです。それ以外の場合は、フィルタリング streambuf を介して入力するのはかなり簡単です。これは、すべて'.'
を','
に変換するか、特定のコンテキストでのみ変換することさえあります (たとえば、前後の文字が数字の場合)。コンテキストなし:
class DotsToCommaStreambuf : public std::streambuf
{
std::streambuf* mySource;
std::istream* myOwner;
char myBuffer;
protected:
int underflow()
{
int ch = mySource->sbumpc();
if ( ch != traits_type::eof() ) {
myBuffer = ch == '.' ? ',' : ch;
setg( &myBuffer, &myBuffer, &myBuffer + 1 );
}
}
public:
DotsToCommaStreambuf( std::streambuf* source )
: mySource( source )
, myOwner( NULL )
{
}
DotsToCommaStreambuf( std::istream& stream )
: mySource( stream.rdbuf() )
, myOwner( &stream )
{
myOwner->rdbuf( this );
}
~DotsToCommaStreambuf()
{
if ( myOwner != NULL ) {
myOwner.rdbuf( mySource );
}
}
}
入力ソースをこのクラスでラップするだけです:
DotsToCommaStreambuf s( myInput );
s
がスコープ内にある限り
、入力に含まれるmyInput
すべてのものを に変換します。'.'
','
それ以来、ファイルを読み取るときではなく、ファイルを生成するときに変更を加えたいというコメントを見てきました。原理は同じですが、フィルタリングする streambuf には所有者がいて、 ではなく
ostream
をオーバーライドします。出力では、ローカル バッファーは必要ないため、さらに簡単です。overflow( int )
underflow
int overflow( int ch )
{
return myDest->sputc( ch == '.' ? ',' : ch );
}
私は c++ Algotithm ライブラリを利用std::replace
し、作業を完了するために使用します。ファイル全体を a に読み込み、string
replace を呼び出します。
std::string s = SOME_STR; //SOME_STR represents the set of data
std::replace( s.begin(), s.end(), '.', ','); // replace all '.' to ','