{"id":13730395,"url":"https://github.com/d99kris/rapidcsv","last_synced_at":"2025-05-14T20:06:12.880Z","repository":{"id":39898159,"uuid":"91819678","full_name":"d99kris/rapidcsv","owner":"d99kris","description":"C++ CSV parser library","archived":false,"fork":false,"pushed_at":"2025-03-22T01:58:54.000Z","size":15925,"stargazers_count":948,"open_issues_count":6,"forks_count":190,"subscribers_count":21,"default_branch":"master","last_synced_at":"2025-04-06T13:04:13.526Z","etag":null,"topics":["c-plus-plus","c-plus-plus-11","csv-parser","library","linux","macos","utf16","utf8","windows"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/d99kris.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-05-19T15:26:33.000Z","updated_at":"2025-04-06T10:43:05.000Z","dependencies_parsed_at":"2024-02-10T12:28:13.715Z","dependency_job_id":"125d92ed-9f4d-4776-bcbe-c7e46a8721b0","html_url":"https://github.com/d99kris/rapidcsv","commit_stats":null,"previous_names":[],"tags_count":26,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d99kris%2Frapidcsv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d99kris%2Frapidcsv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d99kris%2Frapidcsv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d99kris%2Frapidcsv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/d99kris","download_url":"https://codeload.github.com/d99kris/rapidcsv/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248741160,"owners_count":21154252,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c-plus-plus","c-plus-plus-11","csv-parser","library","linux","macos","utf16","utf8","windows"],"created_at":"2024-08-03T02:01:14.272Z","updated_at":"2025-04-13T15:57:31.035Z","avatar_url":"https://github.com/d99kris.png","language":"C++","readme":"Rapidcsv\n========\n\n| **Linux** | **Mac** | **Windows** |\n|-----------|---------|-------------|\n| [![Linux](https://github.com/d99kris/rapidcsv/workflows/Linux/badge.svg)](https://github.com/d99kris/rapidcsv/actions?query=workflow%3ALinux) | [![macOS](https://github.com/d99kris/rapidcsv/workflows/macOS/badge.svg)](https://github.com/d99kris/rapidcsv/actions?query=workflow%3AmacOS) | [![Windows](https://github.com/d99kris/rapidcsv/workflows/Windows/badge.svg)](https://github.com/d99kris/rapidcsv/actions?query=workflow%3AWindows) |\n\nRapidcsv is an easy-to-use C++ CSV parser library. It supports C++11 (and\nlater), is header-only and comes with a basic test suite.\n\nThe library was featured in the book\n[C++20 for Programmers](https://deitel.com/c-plus-plus-20-for-programmers/).\n\nExample Usage\n=============\nHere is a simple example reading a CSV file and getting 'Close' column as a\nvector of floats.\n\n[colhdr.csv](examples/colhdr.csv) content:\n```\nOpen,High,Low,Close,Volume,Adj Close\n64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n```\n\n[ex001.cpp](examples/ex001.cpp) content:\n```cpp\n#include \u003ciostream\u003e\n#include \u003cvector\u003e\n#include \"rapidcsv.h\"\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/colhdr.csv\");\n\n  std::vector\u003cfloat\u003e col = doc.GetColumn\u003cfloat\u003e(\"Close\");\n  std::cout \u003c\u003c \"Read \" \u003c\u003c col.size() \u003c\u003c \" values.\" \u003c\u003c std::endl;\n}\n```\n\nRefer to section [More Examples](#more-examples) below for more examples.\nThe [tests](tests/) directory also contains many simple usage examples.\n\nSupported Platforms\n===================\nRapidcsv is implemented using C++11 with the intention of being portable. It's\ntested on:\n- macOS Sonoma 14.7\n- Ubuntu 24.04 LTS\n- Windows Server / Visual Studio 2022\n\nInstallation\n============\nSimply copy\n[src/rapidcsv.h](https://raw.githubusercontent.com/d99kris/rapidcsv/master/src/rapidcsv.h)\nto your project/include directory and include it.\n\nRapidcsv is also available via\n[vcpkg](https://vcpkg.io/en/packages.html) and\n[conan](https://conan.io/center/rapidcsv) package managers.\n\nMore Examples\n=============\n\nSeveral of the following examples are also provided in the `examples/`\ndirectory and can be executed directly under Linux and macOS. Example running\nex001.cpp:\n\n```\n./examples/ex001.cpp\n```\n\n\nReading a File with Column and Row Headers\n------------------------------------------\nBy default rapidcsv treats the first row as column headers, and the first\ncolumn is treated as data. This allows accessing columns using their labels,\nbut not rows or cells (only using indices). In order to treat the first column\nas row headers one needs to use LabelParams and set pRowNameIdx to 0.\n\n### Column and Row Headers\n[colrowhdr.csv](examples/colrowhdr.csv) content:\n```\nDate,Open,High,Low,Close,Volume,Adj Close\n2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n```\n\n[ex002.cpp](examples/ex002.cpp) content:\n```cpp\n#include \u003ciostream\u003e\n#include \u003cvector\u003e\n#include \"rapidcsv.h\"\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/colrowhdr.csv\", rapidcsv::LabelParams(0, 0));\n\n  std::vector\u003cfloat\u003e close = doc.GetRow\u003cfloat\u003e(\"2017-02-22\");\n  std::cout \u003c\u003c \"Read \" \u003c\u003c close.size() \u003c\u003c \" values.\" \u003c\u003c std::endl;\n\n  long long volume = doc.GetCell\u003clong long\u003e(\"Volume\", \"2017-02-22\");\n  std::cout \u003c\u003c \"Volume \" \u003c\u003c volume \u003c\u003c \" on 2017-02-22.\" \u003c\u003c std::endl;\n}\n```\n\n### Row Headers Only\n[rowhdr.csv](examples/rowhdr.csv) content:\n```\n2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n```\n\n[ex003.cpp](examples/ex003.cpp) content:\n```cpp\n#include \u003ciostream\u003e\n#include \u003cvector\u003e\n#include \"rapidcsv.h\"\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/rowhdr.csv\", rapidcsv::LabelParams(-1, 0));\n\n  std::vector\u003cstd::string\u003e row = doc.GetRow\u003cstd::string\u003e(\"2017-02-22\");\n  std::cout \u003c\u003c \"Read \" \u003c\u003c row.size() \u003c\u003c \" values.\" \u003c\u003c std::endl;\n}\n```\n\n### No Headers\n[nohdr.csv](examples/nohdr.csv) content:\n```\n64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n```\n\n[ex004.cpp](examples/ex004.cpp) content:\n```cpp\n#include \u003ciostream\u003e\n#include \u003cvector\u003e\n#include \"rapidcsv.h\"\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/nohdr.csv\", rapidcsv::LabelParams(-1, -1));\n\n  std::vector\u003cfloat\u003e close = doc.GetColumn\u003cfloat\u003e(5);\n  std::cout \u003c\u003c \"Read \" \u003c\u003c close.size() \u003c\u003c \" values.\" \u003c\u003c std::endl;\n\n  long long volume = doc.GetCell\u003clong long\u003e(4, 2);\n  std::cout \u003c\u003c \"Volume \" \u003c\u003c volume \u003c\u003c \" on 2017-02-22.\" \u003c\u003c std::endl;\n}\n```\n\nReading a File with Custom Separator\n------------------------------------\nFor reading of files with custom separator (i.e. not comma), one need to\nspecify the SeparatorParams argument. The following example reads a file using\nsemi-colon as separator.\n\n[semi.csv](examples/semi.csv) content:\n```\nDate;Open;High;Low;Close;Volume;Adj Close\n2017-02-24;64.529999;64.800003;64.139999;64.620003;21705200;64.620003\n2017-02-23;64.419998;64.730003;64.190002;64.620003;20235200;64.620003\n2017-02-22;64.330002;64.389999;64.050003;64.360001;19259700;64.360001\n2017-02-21;64.610001;64.949997;64.449997;64.489998;19384900;64.489998\n2017-02-17;64.470001;64.690002;64.300003;64.620003;21234600;64.620003\n```\n\n[ex005.cpp](examples/ex005.cpp) content:\n```cpp\n#include \u003ciostream\u003e\n#include \u003cvector\u003e\n#include \"rapidcsv.h\"\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/semi.csv\", rapidcsv::LabelParams(0, 0),\n                          rapidcsv::SeparatorParams(';'));\n\n  std::vector\u003cfloat\u003e close = doc.GetColumn\u003cfloat\u003e(\"Close\");\n  std::cout \u003c\u003c \"Read \" \u003c\u003c close.size() \u003c\u003c \" values.\" \u003c\u003c std::endl;\n\n  long long volume = doc.GetCell\u003clong long\u003e(\"Volume\", \"2017-02-22\");\n  std::cout \u003c\u003c \"Volume \" \u003c\u003c volume \u003c\u003c \" on 2017-02-22.\" \u003c\u003c std::endl;\n}\n```\n\nSupported Get/Set Data Types\n----------------------------\nThe internal cell representation in the Document class is using std::string\nand when other types are requested, standard conversion routines are used.\nAll standard conversions are relatively straight-forward, with the\nexception of `char` for which rapidcsv interprets the cell's (first) byte\nas a character. The following example illustrates the supported data types.\n\n[colrowhdr.csv](examples/colrowhdr.csv) content:\n```\nDate,Open,High,Low,Close,Volume,Adj Close\n2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003\n2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003\n2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001\n2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998\n2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003\n```\n\n[ex006.cpp](examples/ex006.cpp) content:\n```cpp\n#include \u003ciostream\u003e\n#include \u003cvector\u003e\n#include \"rapidcsv.h\"\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/colrowhdr.csv\", rapidcsv::LabelParams(0, 0));\n\n  std::cout \u003c\u003c doc.GetCell\u003cstd::string\u003e(\"Volume\", \"2017-02-22\") \u003c\u003c std::endl;\n  std::cout \u003c\u003c doc.GetCell\u003cint\u003e(\"Volume\", \"2017-02-22\") \u003c\u003c std::endl;\n  std::cout \u003c\u003c doc.GetCell\u003clong\u003e(\"Volume\", \"2017-02-22\") \u003c\u003c std::endl;\n  std::cout \u003c\u003c doc.GetCell\u003clong long\u003e(\"Volume\", \"2017-02-22\") \u003c\u003c std::endl;\n  std::cout \u003c\u003c doc.GetCell\u003cunsigned\u003e(\"Volume\", \"2017-02-22\") \u003c\u003c std::endl;\n  std::cout \u003c\u003c doc.GetCell\u003cunsigned long\u003e(\"Volume\", \"2017-02-22\") \u003c\u003c std::endl;\n  std::cout \u003c\u003c doc.GetCell\u003cunsigned long long\u003e(\"Volume\", \"2017-02-22\") \u003c\u003c std::endl;\n  std::cout \u003c\u003c doc.GetCell\u003cfloat\u003e(\"Volume\", \"2017-02-22\") \u003c\u003c std::endl;\n  std::cout \u003c\u003c doc.GetCell\u003cdouble\u003e(\"Volume\", \"2017-02-22\") \u003c\u003c std::endl;\n  std::cout \u003c\u003c doc.GetCell\u003clong double\u003e(\"Volume\", \"2017-02-22\") \u003c\u003c std::endl;\n  std::cout \u003c\u003c doc.GetCell\u003cchar\u003e(\"Volume\", \"2017-02-22\") \u003c\u003c std::endl;\n}\n```\n\nGlobal Custom Data Type Conversion\n----------------------------------\nOne may override conversion routines (or add new ones) by implementing ToVal()\nand/or ToStr(). Below is an example overriding int conversion, to instead provide\ntwo decimal fixed-point numbers. Also see\n[tests/test035.cpp](https://github.com/d99kris/rapidcsv/blob/master/tests/test035.cpp)\nfor a test overriding ToVal() and ToStr().\n\n[ex008.cpp](examples/ex008.cpp) content:\n```cpp\n#include \u003ciostream\u003e\n#include \u003cvector\u003e\n#include \"rapidcsv.h\"\n\nnamespace rapidcsv\n{\n  template\u003c\u003e\n  void Converter\u003cint\u003e::ToVal(const std::string\u0026 pStr, int\u0026 pVal) const\n  {\n    pVal = static_cast\u003cint\u003e(roundf(100.0f * std::stof(pStr)));\n  }\n}\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/colrowhdr.csv\", rapidcsv::LabelParams(0, 0));\n\n  std::vector\u003cint\u003e close = doc.GetColumn\u003cint\u003e(\"Close\");\n  std::cout \u003c\u003c \"close[0]  = \" \u003c\u003c close[0] \u003c\u003c std::endl;\n  std::cout \u003c\u003c \"close[1]  = \" \u003c\u003c close[1] \u003c\u003c std::endl;\n}\n```\n\nCustom Data Type Conversion Per Call\n------------------------------------\nIt is also possible to override conversions on a per-call basis, enabling more\nflexibility. This is illustrated in the following example. Additional conversion\noverride usage can be found in the test\n[tests/test063.cpp](https://github.com/d99kris/rapidcsv/blob/master/tests/test063.cpp)\n\n[ex009.cpp](examples/ex009.cpp) content:\n```cpp\n#include \u003ciostream\u003e\n#include \u003cvector\u003e\n#include \"rapidcsv.h\"\n\nvoid ConvFixPoint(const std::string\u0026 pStr, int\u0026 pVal)\n{\n  pVal = static_cast\u003cint\u003e(roundf(100.0f * std::stof(pStr)));\n}\n\nstruct MyStruct\n{\n  int val = 0;\n};\n\nvoid ConvMyStruct(const std::string\u0026 pStr, MyStruct\u0026 pVal)\n{\n  pVal.val = static_cast\u003cint\u003e(roundf(100.0f * std::stof(pStr)));\n}\n\nint main()\n{\n  rapidcsv::Document doc(\"examples/colrowhdr.csv\", rapidcsv::LabelParams(0, 0));\n\n  std::cout \u003c\u003c \"regular         = \" \u003c\u003c doc.GetCell\u003cint\u003e(\"Close\", \"2017-02-21\") \u003c\u003c \"\\n\";\n  std::cout \u003c\u003c \"fixpointfunc    = \" \u003c\u003c doc.GetCell\u003cint\u003e(\"Close\", \"2017-02-21\", ConvFixPoint) \u003c\u003c \"\\n\";\n\n  auto convFixLambda = [](const std::string\u0026 pStr, int\u0026 pVal) { pVal = static_cast\u003cint\u003e(roundf(100.0f * stof(pStr))); };\n  std::cout \u003c\u003c \"fixpointlambda  = \" \u003c\u003c doc.GetCell\u003cint\u003e(\"Close\", \"2017-02-21\", convFixLambda) \u003c\u003c \"\\n\";\n\n  std::cout \u003c\u003c \"mystruct        = \" \u003c\u003c doc.GetCell\u003cMyStruct\u003e(\"Close\", \"2017-02-21\", ConvMyStruct).val \u003c\u003c \"\\n\";\n}\n```\n\nReading CSV Data from a Stream or String\n----------------------------------------\nIn addition to specifying a filename, rapidcsv supports constructing a Document\nfrom a stream and, indirectly through stringstream, from a string. File streams\nused with rapidcsv should be opened in `std::ios::binary` mode to enable full\nfunctionality. Here is a simple example reading CSV data from a string:\n\n[ex007.cpp](examples/ex007.cpp) content:\n```cpp\n#include \u003ciostream\u003e\n#include \u003cvector\u003e\n#include \"rapidcsv.h\"\n\nint main()\n{\n  const std::string\u0026 csv =\n    \"Date,Open,High,Low,Close,Volume,Adj Close\\n\"\n    \"2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003\\n\"\n    \"2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003\\n\"\n    \"2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001\\n\"\n    \"2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998\\n\"\n    \"2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003\\n\"\n    ;\n\n  std::stringstream sstream(csv);\n  rapidcsv::Document doc(sstream, rapidcsv::LabelParams(0, 0));\n\n  std::vector\u003cfloat\u003e close = doc.GetColumn\u003cfloat\u003e(\"Close\");\n  std::cout \u003c\u003c \"Read \" \u003c\u003c close.size() \u003c\u003c \" values.\" \u003c\u003c std::endl;\n\n  long long volume = doc.GetCell\u003clong long\u003e(\"Volume\", \"2017-02-22\");\n  std::cout \u003c\u003c \"Volume \" \u003c\u003c volume \u003c\u003c \" on 2017-02-22.\" \u003c\u003c std::endl;\n}\n```\n\nReading a File with Invalid Numbers (e.g. Empty Cells) as Numeric Data\n-----------------------------------------------------------------------\nBy default rapidcsv throws an exception if one tries to access non-numeric\ndata as a numeric data type, as it basically propagates the underlying\nconversion routines' exceptions to the calling application.\n\nThe reason for this is to ensure data correctness. If one wants to be able\nto read data with invalid numbers as numeric data types, one can use\nConverterParams to configure the converter to default to a numeric value.\nThe value is configurable and by default it's\nstd::numeric_limits\u003clong double\u003e::signaling_NaN() for float types, and 0 for\ninteger types. Example:\n\n```cpp\nrapidcsv::Document doc(\"file.csv\", rapidcsv::LabelParams(),\n                        rapidcsv::SeparatorParams(),\n                        rapidcsv::ConverterParams(true));\n```\n\nCheck if a Column Exists\n------------------------\nRapidcsv provides the methods GetColumnNames() and GetRowNames() to retrieve\nthe column and row names. To check whether a particular column name exists\none can for example do:\n\n```cpp\nrapidcsv::Document doc(\"file.csv\");\nstd::vector\u003cstd::string\u003e columnNames = doc.GetColumnNames();\nbool columnExists =\n  (std::find(columnNames.begin(), columnNames.end(), \"A\") != columnNames.end());\n```\n\nHandling Quoted Cells\n---------------------\nBy default rapidcsv automatically dequotes quoted cells (i.e. removes the encapsulating\n`\"` characters from `\"example quoted cell\"`). This functionality may be disabled by\npassing `pAutoQuote = false` in `SeparatorParams`, example:\n\n```cpp\nrapidcsv::Document doc(\"file.csv\", rapidcsv::LabelParams(),\n                       rapidcsv::SeparatorParams(',' /* pSeparator */,\n                                                 false /* pTrim */,\n                                                 rapidcsv::sPlatformHasCR /* pHasCR */,\n                                                 false /* pQuotedLinebreaks */,\n                                                 false /* pAutoQuote */));\n```\n\nSkipping Empty and Comment Lines\n--------------------------------\nRapidcsv reads all lines by default, but may be called to ignore comment lines\nstarting with a specific character, example:\n\n```cpp\nrapidcsv::Document doc(\"file.csv\", rapidcsv::LabelParams(), rapidcsv::SeparatorParams(),\n                       rapidcsv::ConverterParams(),\n                       rapidcsv::LineReaderParams(true /* pSkipCommentLines */,\n                                                  '#' /* pCommentPrefix */));\n```\n\nUsing LineReaderParams it is also possible to skip empty lines, example:\n\n```cpp\nrapidcsv::Document doc(\"file.csv\", rapidcsv::LabelParams(), rapidcsv::SeparatorParams(),\n                       rapidcsv::ConverterParams(),\n                       rapidcsv::LineReaderParams(false /* pSkipCommentLines */,\n                                                  '#' /* pCommentPrefix */,\n                                                  true /* pSkipEmptyLines */));\n```\n\nUTF-16 and UTF-8\n----------------\nRapidcsv's preferred encoding for non-ASCII text is UTF-8. UTF-16 LE and\nUTF-16 BE can be read and written by rapidcsv on systems where codecvt header\nis present. Define HAS_CODECVT before including rapidcsv.h in order to enable\nthe functionality. Rapidcsv unit tests automatically detects the presence of\ncodecvt and sets HAS_CODECVT as needed, see [CMakeLists.txt](CMakeLists.txt)\nfor reference. When enabled, the UTF-16 encoding of any loaded file is\nautomatically detected.\n\nCMake FetchContent\n------------------\nRapidcsv may be included in a CMake project using FetchContent. Refer to the\n[CMake FetchContent Example Project](examples/cmake-fetchcontent) and in\nparticular its [CMakeLists.txt](examples/cmake-fetchcontent/CMakeLists.txt).\n\nLocale Independent Parsing\n--------------------------\nRapidcsv uses locale-dependent conversion functions when parsing float values\nby default. It is possible to configure rapidcsv to use locale independent\nparsing by setting `mNumericLocale` in `ConverterParams`, see for example\n[tests/test087.cpp](https://github.com/d99kris/rapidcsv/blob/master/tests/test087.cpp)\n\nAPI Documentation\n=================\nThe following classes makes up the Rapidcsv interface:\n - [class rapidcsv::Document](doc/rapidcsv_Document.md)\n - [class rapidcsv::LabelParams](doc/rapidcsv_LabelParams.md)\n - [class rapidcsv::SeparatorParams](doc/rapidcsv_SeparatorParams.md)\n - [class rapidcsv::ConverterParams](doc/rapidcsv_ConverterParams.md)\n - [class rapidcsv::LineReaderParams](doc/rapidcsv_LineReaderParams.md)\n - [class rapidcsv::no_converter](doc/rapidcsv_no_converter.md)\n - [class rapidcsv::Converter\u003c T \u003e](doc/rapidcsv_Converter.md)\n\nTechnical Details\n=================\nRapidcsv uses cmake for its tests. Commands to build and execute the test suite:\n\n    mkdir -p build \u0026\u0026 cd build \u0026\u0026 cmake -DRAPIDCSV_BUILD_TESTS=ON .. \u0026\u0026 make \u0026\u0026 ctest -C unit --output-on-failure \u0026\u0026 ctest -C perf --verbose ; cd -\n\nRapidcsv uses [doxygenmd](https://github.com/d99kris/doxygenmd) to generate\nits Markdown API documentation:\n\n    doxygenmd src doc\n\nRapidcsv uses Uncrustify to ensure consistent code formatting:\n\n    uncrustify -c uncrustify.cfg --no-backup src/rapidcsv.h\n\nAlternatives\n============\nThere are many CSV parsers for C++, for example:\n- [Fast C++ CSV Parser](https://github.com/ben-strasser/fast-cpp-csv-parser)\n- [Vince's CSV Parser](https://github.com/vincentlaucsb/csv-parser)\n\nLicense\n=======\nRapidcsv is distributed under the BSD 3-Clause license. See\n[LICENSE](https://github.com/d99kris/rapidcsv/blob/master/LICENSE) file.\n\nContributions\n=============\nBugs, PRs, etc are welcome on the GitHub project page\nhttps://github.com/d99kris/rapidcsv\n\nKeywords\n========\nc++, c++11, csv parser, comma separated values, single header library.\n\n","funding_links":[],"categories":["CSV","C++","Data Formats"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fd99kris%2Frapidcsv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fd99kris%2Frapidcsv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fd99kris%2Frapidcsv/lists"}