
Security News
CVE Volume Surges Past 48,000 in 2025 as WordPress Plugin Ecosystem Drives Growth
CVE disclosures hit a record 48,185 in 2025, driven largely by vulnerabilities in third-party WordPress plugins.
github.com/vincentlaucsb/csv-parser
Advanced tools
There's plenty of other CSV parsers in the wild, but I had a hard time finding what I wanted. Specifically, I wanted something which had an interface similar to Python's csv module. Furthermore, I wanted support for special use cases such as calculating statistics on very large files. Thus, this library was created with these following goals in mind:
This CSV parser uses multiple threads to simulatenously pull data from disk and parse it. Furthermore, it is capable of incremental streaming (parsing larger than RAM files), and quickly parsing data types.
This CSV parser is much more than a fancy string splitter, and follows every guideline from RFC 4180. On the other hand, it is also robust and capable of handling deviances from the standard. An optional strict parsing mode can be enabled to sniff out errors in files.
In additon to being easy on your computer's hardware, this library is also easy on you--the developer. Some helpful features include:
In addition to using modern C++ features to build a memory safe parser while still performing well, this parser has a extensive test suite.
All of this library's essentials are located under src/, with no dependencies aside from the STL. This is a C++17 library developed using Microsoft Visual Studio and compatible with g++ and clang. The CMakeList and Makefile contain instructions for building the main library, some sample programs, and the test suite.
GCC/Clang Compiler Flags: -pthread -O3 -std=c++17
If you're including this in another CMake project, you can simply clone this repo into your project directory, and add the following to your CMakeLists.txt:
include(${CMAKE_SOURCE_DIR}/.../csv-parser/CMakeLists.txt)
# ...
add_executable(<your program> ...)
target_link_libraries(<your program> csv)
With this library, you can easily stream over a large file without reading its entirety into memory.
C++ Style
# include "csv_parser.hpp"
using namespace csv;
...
CSVReader reader("very_big_file.csv");
double sum = 0;
for (CSVRow& row: reader) { // Input iterator
for (CSVField& field: row) {
// For efficiency, get<>() produces a string_view
std::cout << field.get<>() << ...
}
/* Sum up wages
* Notes:
* - Indexing can be done by position (size_t) or column name
* - Invalid positions/column names will throw runtime errors
*/
sum += field["Total Salary"].get<double>();
}
...
Old-Fashioned C Style Loop
...
CSVReader reader("very_big_file.csv");
CSVRow row;
while (reader.read_row(row)) {
// Do stuff with row here
}
...
If your CSV has lots of numeric values, you can also have this parser (lazily) convert them to the proper data type. Type checking is performed on conversions to prevent undefined behavior.
# include "csv_parser.hpp"
using namespace csv;
...
CSVReader reader("very_big_file.csv");
for (auto& row: reader) {
if (row["timestamp"].is_int()) {
row["timestamp"].get<int>();
// ..
}
}
Although the CSV parser has a decent guessing mechanism, in some cases it is preferrable to specify the exact parameters of a file.
# include "csv_parser.hpp"
# include ...
using namespace csv;
CSVFormat format = {
'\t', // Delimiter
'~', // Quote-character
'2', // Line number of header
{} // Column names -- if empty, then filled by reading header row
};
CSVReader reader("wierd_csv_dialect.csv", {}, format);
for (auto& row: reader) {
// Do stuff with rows here
}
# include "csv_parser.hpp"
using namespace csv;
...
// Method 1: Using parse()
std::string csv_string = "Actor,Character"
"Will Ferrell,Ricky Bobby\r\n"
"John C. Reilly,Cal Naughton Jr.\r\n"
"Sacha Baron Cohen,Jean Giard\r\n"
auto rows = parse(csv_string);
for (auto& r: rows) {
// Do stuff with row here
}
// Method 2: Using _csv operator
auto rows = "Actor,Character"
"Will Ferrell,Ricky Bobby\r\n"
"John C. Reilly,Cal Naughton Jr.\r\n"
"Sacha Baron Cohen,Jean Giard\r\n"_csv;
for (auto& r: rows) {
// Do stuff with row here
}
# include "csv_writer.hpp"
# include ...
using namespace csv;
using vector;
using string;
...
std::stringstream ss; // Can also use ifstream, etc.
auto writer = make_csv_writer(ss);
writer << vector<string>({ "A", "B", "C" })
<< vector<string>({ "I'm", "too", "tired" })
<< vector<string>({ "to", "write", "documentation" });
...
Bug reports, feature requests, and so on are always welcome. Feel free to leave a note in the Issues section.
FAQs
Unknown package
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
CVE disclosures hit a record 48,185 in 2025, driven largely by vulnerabilities in third-party WordPress plugins.

Security News
Socket CEO Feross Aboukhadijeh joins Insecure Agents to discuss CVE remediation and why supply chain attacks require a different security approach.

Security News
Tailwind Labs laid off 75% of its engineering team after revenue dropped 80%, as LLMs redirect traffic away from documentation where developers discover paid products.