| Linux | 蘋果 | 視窗 |
|---|---|---|
appedcsv是一個易於使用的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;
}有關更多示例,請參閱下面的更多示例。測試目錄還包含許多簡單的用法示例。
使用C ++ 11實施了MaparCSV,目的是要便攜。它已在:
只需將src/appapcsv.h複製到您的項目/包括目錄並包括該目錄。
也可以通過VCPKG和Conan軟件包經理獲得Maparcsv。
examples/目錄中還提供了以下幾個示例,可以直接在Linux和MacOS下執行。示例運行ex001.cpp:
./examples/ex001.cpp
默認情況下,Raptcsv將第一行視為列標題,第一行被視為數據。這允許使用其標籤訪問列,而不能使用行或單元格(僅使用指數)。為了將第一列視為行標頭,需要使用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;
}為了讀取使用自定義分離器(即不是逗號)的文件,需要指定sameatorParams參數。以下示例使用半彩色作為分隔符讀取文件。
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,並且當請求其他類型時,使用標準轉換例程。所有標準轉換都是相對直接的,除了char的char以外,appcsv將單元格(第一個)字節解釋為字符。以下示例說明了受支持的數據類型。
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()來覆蓋轉換例程(或添加新的例程)。下面是一個示例覆蓋INT轉換,而是提供兩個小數點定點編號。另請參見測試/test035.cpp,以進行測試覆蓋TOVAL()和TOSTR()。
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;
}也可以按每句話覆蓋轉換,從而提高靈活性。以下示例中說明了這一點。可以在測試測試/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 " ;
}除了指定文件名外,MaparCSV還支持從流並通過StringStream間接構建文檔,並從字符串中間接構建文檔。與MappCSV一起使用的文件流應在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;
}默認情況下,如果人們試圖將非數字數據訪問數字數據類型,則會引發異常,因為它基本上傳播了基礎轉換例程對調用應用程序的異常。
這樣做的原因是確保數據正確性。如果一個人希望能夠將具有無效數字的數據讀取為數字數據類型,則可以使用ConverterParams將轉換器配置為默認值為數字值。該值是可配置的,默認情況下它的std :: numeric_limits :: Signaling_nan()用於float類型,而整數類型為0。例子:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(),
rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams( true ));appedcsv提供方法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());默認情況下,apparcsv會自動取消引用的單元格(IE刪除了"example quoted cell"中的"字符”)。該功能可以通過傳遞pAutoQuote = false在SeparatorParams中被禁用,示例:示例:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(),
rapidcsv::SeparatorParams( ' , ' /* pSeparator */ ,
false /* pTrim */ ,
rapidcsv:: sPlatformHasCR /* pHasCR */ ,
false /* pQuotedLinebreaks */ ,
false /* pAutoQuote */ ));默認情況下,Maparcsv讀取所有行,但可以被要求忽略以特定字符開頭的評論行,例如:
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 */ ));appcsv對非ASCII文本的首選編碼是UTF-8。可以在存在CodeCvt標頭的系統上讀取和撰寫UTF-16 LE和UTF-16。在包含ropaipcsv.h之前定義has_codecvt,以啟用功能。 RapidCSV單元測試會自動檢測到codecvt的存在,並根據需要檢測has_codecvt的存在,請參見cmakelists.txt以獲取參考。啟用後,將自動檢測到任何加載文件的UTF-16編碼。
使用FetchContent的CMAKE項目中可能包括MaparCSV。請參閱cmake提取示例項目,尤其是其cmakelists.txt。
當默認情況下解析float值時,appedcsv使用LOCALE依賴性轉換函數。可以通過在ConverterParams中設置mNumericLocale來配置Maparcsv使用Locale Indepenlate解析,例如,請參見測試/test087.cpp
以下類構成了appcsv接口:
Maparcsv使用Cmake進行測試。命令構建和執行測試套件:
mkdir -p build && cd build && cmake -DRAPIDCSV_BUILD_TESTS=ON .. && make && ctest -C unit --output-on-failure && ctest -C perf --verbose ; cd -
MaparcSV使用doxygenmd生成其Markdown API文檔:
doxygenmd src doc
Mappcsv使用不穩定來確保一致的代碼格式:
uncrustify -c uncrustify.cfg --no-backup src/rapidcsv.h
例如,C ++有許多CSV解析器:
MaparCSV根據BSD 3條規定許可分配。請參閱許可證文件。
歡迎在GitHub項目頁面https://github.com/d99kris/rapidcsv上進行錯誤,PRS等
C ++,C ++ 11,CSV解析器,逗號分隔值,單頭庫。