| 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解析器,逗号分隔值,单头库。