| Linux | マック | Windows |
|---|---|---|
RapidCSVは、使いやすいC ++ CSVパーサーライブラリです。 C ++ 11(およびその後)をサポートし、ヘッダーのみであり、基本的なテストスイートが付属しています。
ライブラリは、プログラマー向けの本C ++ 20で紹介されていました。
CSVファイルを読んで、フロートのベクトルとして「閉じる」列を取得する簡単な例です。
colhdr.csvコンテンツ:
Open,High,Low,Close,Volume,Adj Close
64.529999,64.800003,64.139999,64.620003,21705200,64.620003
64.419998,64.730003,64.190002,64.620003,20235200,64.620003
64.330002,64.389999,64.050003,64.360001,19259700,64.360001
64.610001,64.949997,64.449997,64.489998,19384900,64.489998
64.470001,64.690002,64.300003,64.620003,21234600,64.620003
ex001.cppコンテンツ:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
int main ()
{
rapidcsv::Document doc ( " examples/colhdr.csv " );
std::vector< float > col = doc. GetColumn < float >( " Close " );
std::cout << " Read " << col. size () << " values. " << std::endl;
}その他の例については、以下の例を参照してください。テストディレクトリには、多くの簡単な使用例も含まれています。
RapidCSVは、ポータブルであることを意図してC ++ 11を使用して実装されます。テストされています:
SRC/RapidCSV.Hをプロジェクトにコピーして/ディレクトリを含めて含めてください。
RapidCSVは、VCPKGおよびCONANパッケージマネージャーを介しても利用できます。
次の例のいくつかは、 examples/ディレクトリにも提供されており、LinuxおよびMacOSの下で直接実行できます。 ex001.cppを実行している例:
./examples/ex001.cpp
デフォルトでは、RapidCSVは最初の行を列ヘッダーとして扱い、最初の列はデータとして扱われます。これにより、ラベルを使用して列にアクセスできますが、行やセル(インデックスのみを使用する)ではなくアクセスできます。最初の列を行ヘッダーとして扱うためには、LabelParamsを使用し、PrownameIdxを0に設定する必要があります。
colrowhdr.csvコンテンツ:
Date,Open,High,Low,Close,Volume,Adj Close
2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003
2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003
2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001
2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998
2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003
ex002.cppコンテンツ:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
int main ()
{
rapidcsv::Document doc ( " examples/colrowhdr.csv " , rapidcsv::LabelParams ( 0 , 0 ));
std::vector< float > close = doc. GetRow < float >( " 2017-02-22 " );
std::cout << " Read " << close . size () << " values. " << std::endl;
long long volume = doc. GetCell < long long >( " Volume " , " 2017-02-22 " );
std::cout << " Volume " << volume << " on 2017-02-22. " << std::endl;
}rowhdr.csvコンテンツ:
2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003
2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003
2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001
2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998
2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003
ex003.cppコンテンツ:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
int main ()
{
rapidcsv::Document doc ( " examples/rowhdr.csv " , rapidcsv::LabelParams (- 1 , 0 ));
std::vector<std::string> row = doc. GetRow <std::string>( " 2017-02-22 " );
std::cout << " Read " << row. size () << " values. " << std::endl;
}nohdr.csvコンテンツ:
64.529999,64.800003,64.139999,64.620003,21705200,64.620003
64.419998,64.730003,64.190002,64.620003,20235200,64.620003
64.330002,64.389999,64.050003,64.360001,19259700,64.360001
64.610001,64.949997,64.449997,64.489998,19384900,64.489998
64.470001,64.690002,64.300003,64.620003,21234600,64.620003
ex004.cppコンテンツ:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
int main ()
{
rapidcsv::Document doc ( " examples/nohdr.csv " , rapidcsv::LabelParams (- 1 , - 1 ));
std::vector< float > close = doc. GetColumn < float >( 5 );
std::cout << " Read " << close . size () << " values. " << std::endl;
long long volume = doc. GetCell < long long >( 4 , 2 );
std::cout << " Volume " << volume << " on 2017-02-22. " << std::endl;
}カスタムセパレーター(つまり、コンマではない)を使用したファイルを読むには、SeparatorParams引数を指定する必要があります。次の例では、セミコロンをセパレーターとして使用してファイルを読み取ります。
Semi.csvコンテンツ:
Date;Open;High;Low;Close;Volume;Adj Close
2017-02-24;64.529999;64.800003;64.139999;64.620003;21705200;64.620003
2017-02-23;64.419998;64.730003;64.190002;64.620003;20235200;64.620003
2017-02-22;64.330002;64.389999;64.050003;64.360001;19259700;64.360001
2017-02-21;64.610001;64.949997;64.449997;64.489998;19384900;64.489998
2017-02-17;64.470001;64.690002;64.300003;64.620003;21234600;64.620003
ex005.cppコンテンツ:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
int main ()
{
rapidcsv::Document doc ( " examples/semi.csv " , rapidcsv::LabelParams ( 0 , 0 ),
rapidcsv::SeparatorParams ( ' ; ' ));
std::vector< float > close = doc. GetColumn < float >( " Close " );
std::cout << " Read " << close . size () << " values. " << std::endl;
long long volume = doc. GetCell < long long >( " Volume " , " 2017-02-22 " );
std::cout << " Volume " << volume << " on 2017-02-22. " << std::endl;
}ドキュメントクラスの内部セル表現はstd :: stringを使用しており、他のタイプが要求されると、標準の変換ルーチンが使用されます。すべての標準変換は比較的簡単ですが、RapidCSVがセルの(最初の)バイトを文字として解釈するcharを除きます。次の例は、サポートされているデータ型を示しています。
colrowhdr.csvコンテンツ:
Date,Open,High,Low,Close,Volume,Adj Close
2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003
2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003
2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001
2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998
2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003
ex006.cppコンテンツ:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
int main ()
{
rapidcsv::Document doc ( " examples/colrowhdr.csv " , rapidcsv::LabelParams ( 0 , 0 ));
std::cout << doc. GetCell <std::string>( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < int >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < long >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < long long >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < unsigned >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < unsigned long >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < unsigned long long >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < float >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < double >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < long double >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < char >( " Volume " , " 2017-02-22 " ) << std::endl;
}Toval()および/またはtoStr()を実装することにより、変換ルーチン(または新しいものを追加)をオーバーライドできます。以下は、2つの小数点以下の固定点数を提供するために、オーバーライドINT変換の例です。また、toval()およびtoStr()を上書きするテストについては、tests/test035.cppを参照してください。
ex008.cppコンテンツ:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
namespace rapidcsv
{
template <>
void Converter< int >::ToVal( const std::string& pStr, int & pVal) const
{
pVal = static_cast < int >( roundf ( 100 . 0f * std::stof (pStr)));
}
}
int main ()
{
rapidcsv::Document doc ( " examples/colrowhdr.csv " , rapidcsv::LabelParams ( 0 , 0 ));
std::vector< int > close = doc. GetColumn < int >( " Close " );
std::cout << " close[0] = " << close [ 0 ] << std::endl;
std::cout << " close[1] = " << close [ 1 ] << std::endl;
}また、コンバージョンを1コールごとにオーバーライドして、柔軟性を高めることもできます。これを次の例に示します。追加の変換オーバーライドの使用は、テストテスト/test063.cppにあります
ex009.cppコンテンツ:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
void ConvFixPoint ( const std::string& pStr, int & pVal)
{
pVal = static_cast < int >( roundf ( 100 . 0f * std::stof (pStr)));
}
struct MyStruct
{
int val = 0 ;
};
void ConvMyStruct ( const std::string& pStr, MyStruct& pVal)
{
pVal. val = static_cast < int >( roundf ( 100 . 0f * std::stof (pStr)));
}
int main ()
{
rapidcsv::Document doc ( " examples/colrowhdr.csv " , rapidcsv::LabelParams ( 0 , 0 ));
std::cout << " regular = " << doc. GetCell < int >( " Close " , " 2017-02-21 " ) << " n " ;
std::cout << " fixpointfunc = " << doc. GetCell < int >( " Close " , " 2017-02-21 " , ConvFixPoint) << " n " ;
auto convFixLambda = []( const std::string& pStr, int & pVal) { pVal = static_cast < int >( roundf ( 100 . 0f * stof (pStr))); };
std::cout << " fixpointlambda = " << doc. GetCell < int >( " Close " , " 2017-02-21 " , convFixLambda) << " n " ;
std::cout << " mystruct = " << doc. GetCell <MyStruct>( " Close " , " 2017-02-21 " , ConvMyStruct). val << " n " ;
}ファイル名の指定に加えて、RapidCSVは、ストリームから、そして間接的に文字列からドキュメントの構築をサポートします。 rapidCSVで使用されるファイルストリームは、完全な機能を有効にするためにstd::ios::binaryモードで開く必要があります。ここに、文字列からCSVデータを読む簡単な例があります。
ex007.cppコンテンツ:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
int main ()
{
const std::string& csv =
" Date,Open,High,Low,Close,Volume,Adj Close n "
" 2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003 n "
" 2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003 n "
" 2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001 n "
" 2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998 n "
" 2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003 n "
;
std::stringstream sstream (csv);
rapidcsv::Document doc (sstream, rapidcsv::LabelParams ( 0 , 0 ));
std::vector< float > close = doc. GetColumn < float >( " Close " );
std::cout << " Read " << close . size () << " values. " << std::endl;
long long volume = doc. GetCell < long long >( " Volume " , " 2017-02-22 " );
std::cout << " Volume " << volume << " on 2017-02-22. " << std::endl;
}デフォルトでは、rapidCSVは、非数値データに数値データ型としてアクセスしようとしようとする場合、基本的に基礎となる変換ルーチンの呼び出しアプリケーションに対する例外を伝播するため、例外をスローします。
この理由は、データの正しさを確保するためです。数値データ型として無効な数値を持つデータを読み取ることができる場合は、ConverterParamsを使用してConverterをデフォルトに設定して数値に設定できます。値は設定可能であり、デフォルトではstd :: numeric_limits :: signaling_nan()で、integer型の場合は0です。例:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(),
rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams( true ));rapidcsvは、列と行の名前を取得するためのメソッドgetColumnNames()およびgetRownames()を提供します。特定の列名が存在するかどうかを確認するには、例えば次のことができます。
rapidcsv::Document doc ( " file.csv " );
std::vector<std::string> columnNames = doc.GetColumnNames();
bool columnExists =
(std::find(columnNames.begin(), columnNames.end(), " A " ) != columnNames.end());デフォルトでは、rapidcsvは引用されたセルを自動的に不動化します(つまり、 "example quoted cell" SeparatorParamsカプセル化する"化された文字pAutoQuote = false削除します)。
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(),
rapidcsv::SeparatorParams( ' , ' /* pSeparator */ ,
false /* pTrim */ ,
rapidcsv:: sPlatformHasCR /* pHasCR */ ,
false /* pQuotedLinebreaks */ ,
false /* pAutoQuote */ ));RapidCSVはデフォルトですべての行を読み取りますが、特定の文字で始まるコメント行を無視するように呼ばれる場合があります。例:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(), rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams(),
rapidcsv::LineReaderParams( true /* pSkipCommentLines */ ,
' # ' /* pCommentPrefix */ ));LinereaderParamsを使用すると、空の行をスキップすることもできます。例:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(), rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams(),
rapidcsv::LineReaderParams( false /* pSkipCommentLines */ ,
' # ' /* pCommentPrefix */ ,
true /* pSkipEmptyLines */ ));ASCII以外のテキストのRapidCSVの優先エンコードはUTF-8です。 UTF-16 LEおよびUTF-16 BEは、CODECVTヘッダーが存在するシステム上のRapidCSVによって読み書きできます。機能を有効にするために、rapidcsv.hを含める前にhas_codecvtを定義します。 RapidCSVユニットテストは、CodeCVTの存在を自動的に検出し、必要に応じてHAS_CODECVTを設定します。参照についてはcmakelists.txtを参照してください。有効にすると、ロードされたファイルのUTF-16エンコードが自動的に検出されます。
RapidCSVは、FetchContentを使用してCmakeプロジェクトに含まれる場合があります。 Cmake FetchContentの例プロジェクト、特にそのcmakelists.txtを参照してください。
RapidCSVは、デフォルトでフロート値を解析するときにロケール依存の変換関数を使用します。 ConverterParamsにmNumericLocaleを設定することにより、rapidcsvを使用するようにロケール独立解析を使用することが可能です。たとえば、tests/test087.cppを参照してください
次のクラスでは、RapidCSVインターフェイスが構成されています。
RapidCSVは、テストにCmakeを使用します。テストスイートを構築および実行するコマンド:
mkdir -p build && cd build && cmake -DRAPIDCSV_BUILD_TESTS=ON .. && make && ctest -C unit --output-on-failure && ctest -C perf --verbose ; cd -
RapidCSVはDoxyGenMDを使用して、MarkDown APIドキュメントを生成します。
doxygenmd src doc
RapidCSVはUNCRUSTIFYを使用して、一貫したコードフォーマットを確保します。
uncrustify -c uncrustify.cfg --no-backup src/rapidcsv.h
たとえば、C ++には多くのCSVパーサーがあります。
RapidCSVは、BSD 3-Clauseライセンスの下で配布されます。ライセンスファイルを参照してください。
Githubプロジェクトページhttps://github.com/d99kris/rapidcsvでバグ、PRSなどをお迎えします
C ++、C ++ 11、CSVパーサー、コンマ分離値、シングルヘッダーライブラリ。