| Linux | Mac | Windows |
|---|---|---|
RapidCSV adalah perpustakaan Parser C ++ CSV yang mudah digunakan. Ini mendukung C ++ 11 (dan lebih baru), hanya header dan dilengkapi dengan suite tes dasar.
Perpustakaan ditampilkan dalam buku C ++ 20 untuk pemrogram.
Berikut adalah contoh sederhana yang membaca file CSV dan mendapatkan kolom 'Tutup' sebagai vektor float.
Konten 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
Konten 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;
}Lihat bagian lebih lanjut contoh di bawah ini untuk contoh lebih lanjut. Direktori Tes juga berisi banyak contoh penggunaan sederhana.
RapidCSV diimplementasikan menggunakan C ++ 11 dengan maksud menjadi portabel. Itu telah diuji pada:
Cukup salin src/rapidcsv.h ke proyek Anda/sertakan direktori dan sertakan.
RapidCSV juga tersedia melalui manajer paket VCPKG dan Conan.
Beberapa contoh berikut juga disediakan dalam examples/ direktori dan dapat dieksekusi langsung di bawah Linux dan MacOS. Contoh Menjalankan ex001.cpp:
./examples/ex001.cpp
Secara default RapidCSV memperlakukan baris pertama sebagai header kolom, dan kolom pertama diperlakukan sebagai data. Ini memungkinkan mengakses kolom menggunakan labelnya, tetapi bukan baris atau sel (hanya menggunakan indeks). Untuk memperlakukan kolom pertama sebagai header baris, seseorang perlu menggunakan labelparams dan mengatur PrownameIdx ke 0.
Konten 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
Konten 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;
}Konten 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
Konten 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;
}Konten 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
Konten 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;
}Untuk membaca file dengan pemisah khusus (yaitu bukan koma), orang perlu menentukan argumen separatorparams. Contoh berikut membaca file menggunakan semi-kolon sebagai pemisah.
Konten 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
Konten 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;
} Representasi sel internal di kelas dokumen menggunakan STD :: String dan ketika jenis lain diminta, rutinitas konversi standar digunakan. Semua konversi standar relatif lurus-lurus, dengan pengecualian char yang menginterpretasikan RapidCSV di sel (pertama) sebagai karakter. Contoh berikut menggambarkan tipe data yang didukung.
Konten 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
Konten 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;
}Seseorang dapat mengganti rutin konversi (atau menambahkan yang baru) dengan menerapkan toval () dan/atau tostr (). Di bawah ini adalah contoh konversi int overriding, untuk memberikan dua bilangan titik tetap desimal. Juga lihat tes/test035.cpp untuk uji test toval () dan tostr ().
Konten 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;
}Dimungkinkan juga untuk mengganti konversi berdasarkan per panggilan, memungkinkan lebih banyak fleksibilitas. Ini diilustrasikan dalam contoh berikut. Penggunaan override konversi tambahan dapat ditemukan di tes tes/test063.cpp
Konten 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 " ;
} Selain menentukan nama file, RapidCSV mendukung membangun dokumen dari aliran dan, secara tidak langsung melalui stringstream, dari string. Aliran file yang digunakan dengan RapidCSV harus dibuka di std::ios::binary Mode untuk mengaktifkan fungsionalitas penuh. Berikut adalah contoh sederhana membaca data CSV dari string:
Konten 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;
}Secara default RapidCSV melempar pengecualian jika seseorang mencoba mengakses data non-numerik sebagai tipe data numerik, karena pada dasarnya menyebarkan pengecualian rutin konversi yang mendasarinya ke aplikasi panggilan.
Alasan untuk ini adalah untuk memastikan kebenaran data. Jika seseorang ingin dapat membaca data dengan angka yang tidak valid sebagai tipe data numerik, seseorang dapat menggunakan ConverterParams untuk mengonfigurasi konverter ke default ke nilai numerik. Nilainya dapat dikonfigurasi dan secara default itu std :: numeric_limits :: Signaling_nan () untuk jenis float, dan 0 untuk tipe integer. Contoh:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(),
rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams( true ));RapidCSV menyediakan metode getColumnNames () dan getRownames () untuk mengambil kolom dan nama baris. Untuk memeriksa apakah ada nama kolom tertentu, seseorang dapat melakukan:
rapidcsv::Document doc ( " file.csv " );
std::vector<std::string> columnNames = doc.GetColumnNames();
bool columnExists =
(std::find(columnNames.begin(), columnNames.end(), " A " ) != columnNames.end()); Secara default rapidCSV secara otomatis dequotes sel yang dikutip (yaitu menghilangkan karakter enkapsulasi " dari "example quoted cell" ). Fungsionalitas ini dapat dinonaktifkan dengan lulus pAutoQuote = false dalam SeparatorParams , contoh:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(),
rapidcsv::SeparatorParams( ' , ' /* pSeparator */ ,
false /* pTrim */ ,
rapidcsv:: sPlatformHasCR /* pHasCR */ ,
false /* pQuotedLinebreaks */ ,
false /* pAutoQuote */ ));RapidCSV membaca semua baris secara default, tetapi dapat dipanggil untuk mengabaikan baris komentar yang dimulai dengan karakter tertentu, contoh:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(), rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams(),
rapidcsv::LineReaderParams( true /* pSkipCommentLines */ ,
' # ' /* pCommentPrefix */ ));Menggunakan linereaderparams juga dimungkinkan untuk melewatkan garis kosong, contoh:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(), rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams(),
rapidcsv::LineReaderParams( false /* pSkipCommentLines */ ,
' # ' /* pCommentPrefix */ ,
true /* pSkipEmptyLines */ ));Pengkodean pilihan RapidCSV untuk teks non-ASCII adalah UTF-8. UTF-16 LE dan UTF-16 dapat dibaca dan ditulis oleh RapidCSV pada sistem di mana codecvt header ada. Tentukan has_codecvt sebelum memasukkan rapidcsv.h untuk mengaktifkan fungsionalitas. Uji unit RapidCSV secara otomatis mendeteksi keberadaan codecvt dan set has_codecvt sesuai kebutuhan, lihat cmakelists.txt untuk referensi. Saat diaktifkan, pengkodean UTF-16 dari setiap file yang dimuat terdeteksi secara otomatis.
RapidCSV dapat dimasukkan dalam proyek CMake menggunakan fetchContent. Lihat Proyek Contoh CMake FetchContent dan khususnya cmakelists.txt.
RapidCSV menggunakan fungsi konversi yang bergantung pada lokal saat mem-parsing nilai float secara default. Dimungkinkan untuk mengonfigurasi RapidCSV untuk menggunakan parsing independen lokal dengan mengatur mNumericLocale di ConverterParams , lihat misalnya tes/test087.cpp
Kelas -kelas berikut membentuk antarmuka RapidCSV:
RapidCSV menggunakan CMake untuk pengujiannya. Perintah untuk membangun dan menjalankan test suite:
mkdir -p build && cd build && cmake -DRAPIDCSV_BUILD_TESTS=ON .. && make && ctest -C unit --output-on-failure && ctest -C perf --verbose ; cd -
RapidCSV menggunakan doxygenmd untuk menghasilkan dokumentasi API penurunan harga:
doxygenmd src doc
RapidCSV menggunakan Uncustify untuk memastikan pemformatan kode yang konsisten:
uncrustify -c uncrustify.cfg --no-backup src/rapidcsv.h
Ada banyak parser CSV untuk C ++, misalnya:
RapidCSV didistribusikan di bawah lisensi BSD 3-Clause. Lihat file lisensi.
Bugs, PR, dll dipersilakan di halaman proyek GitHub https://github.com/d99kris/rapidcsv
C ++, C ++ 11, Parser CSV, Nilai yang Dipisahkan Koma, Perpustakaan Header Tunggal.