| Linux | Маки | Окна |
|---|---|---|
Rapidcsv-это простая в использовании библиотеку анализатора CSV CSV 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 Content:
# 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 Content:
# 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 Content:
# 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 Content:
# 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 Content:
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 Content:
# 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 , для которого Rapidcsv интерпретирует байт ячейки (первого) как персонажа. Следующий пример иллюстрирует поддерживаемые типы данных.
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 Content:
# 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, чтобы вместо этого предоставить два десятичных значения фиксированных номеров. Также см. Tests/test035.cpp для теста переоценки toval () и tostr ().
Ex008.cpp Content:
# 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 Content:
# 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 поддерживает построение документа из потока и, косвенно через StringStream из строки. Файл -потоки, используемые с Rapidcsv, должны быть открыты в std::ios::binary , чтобы обеспечить полную функциональность. Вот простой пример чтения данных CSV из строки:
Ex007.cpp Content:
# 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 для настройки преобразователя на по умолчанию к числовому значению. Значение настраивается, и по умолчанию это std :: numeric_limits :: signaling_nan () для типов плавания и 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" ). Эта функция может быть отключена путем прохождения pAutoQuote = false в SeparatorParams , пример:
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 */ ));Предпочтительное кодирование Rapidcsv для текста, не являющегося ASCII, является UTF-8. UTF-16 LE и UTF-16 могут быть прочитаны и написаны RAPIDCSV в системах, где присутствует заголовок CODECVT. Определите has_codecvt, прежде чем включать rapidcsv.h, чтобы включить функциональность. Тесты модуля Rapidcsv автоматически обнаруживают наличие Codecvt и устанавливает has_codecvt по мере необходимости, см. Cmakelists.txt для справки. При включении, кодирование UTF-16 любого загруженного файла автоматически обнаруживается.
Rapidcsv может быть включен в проект Cmake с использованием FetchContent. Обратитесь к примеру Cmake FetchContent Project и, в частности, его cmakelists.txt.
Rapidcsv использует зависимые от локализации функции преобразования, когда по умолчанию диапазон по умолчанию. Можно настроить rapidcsv для использования локального независимого анализа, установив mNumericLocale в ConverterParams , см., Например, 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 для генерации документации API Markdown:
doxygenmd src doc
Rapidcsv использует uncrustify для обеспечения согласованного форматирования кода:
uncrustify -c uncrustify.cfg --no-backup src/rapidcsv.h
Например, есть много анализаторов CSV для C ++:
Rapidcsv распределяется по лицензии BSD 3-rack. См. Файл лицензии.
Ошибки, PRS и т. Д. Приглашаются на странице проекта GitHub https://github.com/d99kris/rapidcsv
C ++, C ++ 11, анализатор CSV, разделенные запятые значения, библиотека с одним заголовком.