C/C++ CSV Parser
Introduction
This project was created in order to enable a CSV parsing API for C programmers.
The CSV format is commonly easy to parse, but there are special cases which are less-trivial, and that makes it recommended to use a standard tested parser
API & Usage Example
Usage Example
#include <stdio.h> #include "csvparser.h" int main() { int i = 0; // file, delimiter, first_line_is_header? CsvParser *csvparser = CsvParser_new("Book1.csv", ",", 1); CsvRow *row; const CsvRow *header = CsvParser_getHeader(csvparser); if (header == NULL) { printf("%s\n", CsvParser_getErrorMessage(csvparser)); return 1; } const char **headerFields = CsvParser_getFields(header); for (i = 0 ; i < CsvParser_getNumFields(header) ; i++) { printf("TITLE: %s\n", headerFields[i]); } while ((row = CsvParser_getRow(csvparser)) ) { printf("NEW LINE:\n"); const char **rowFields = CsvParser_getFields(row); for (i = 0 ; i < CsvParser_getNumFields(row) ; i++) { printf("FIELD: %s\n", rowFields[i]); } CsvParser_destroy_row(row); } CsvParser_destroy(csvparser); return 0; }
API
/* Create a new instance of CsvParser, that parses a file Returns an instance of CsvParser filePath - relative/absolute path to CSV file delimiter - pointer to a single char to be considered as delimiter. If NULL is passed, using default, which is a comma (,) char firstLineIsHeader - Use 0 for start reading rows from the first line. Use non-zero value for starting to read rows from the second line */ CsvParser *CsvParser_new(const char *filePath, const char *delimiter, int firstLineIsHeader); /* Create a new instance of CsvParser, that parses a given string Returns an instance of CsvParser csvString - String that contains CSV formatted text, to be parsed delimiter - pointer to a single char to be considered as delimiter. If NULL is passed, using default, which is a comma (,) char firstLineIsHeader - Use 0 for start reading rows from the first line. Use non-zero value for starting to read rows from the second line */ CsvParser *CsvParser_new_from_string(const char *csvString, const char *delimiter, int firstLineIsHeader); /* Get the next row from the CSV Returns an instance of CsvRow, or NULL in case of EOF or error csvParser - an instance of CsvParser */ CsvRow *CsvParser_getRow(CsvParser *csvParser); /* Get the first row of the file. Works only if CsvParser was initialized with firstLineIsHeader != 0 Returns an instance of CsvRow, or NULL in case of EOF or error csvParser - an instance of CsvParser */ const CsvRow *CsvParser_getHeader(CsvParser *csvParser); /* Get number of fields in given row Returns an integer than indicates number of fields in the row csvRow - an instance of CsvRow */ int CsvParser_getNumFields(const CsvRow *csvRow); /* Get array of all fields in given row Returns an array of c-strings csvRow - an instance of CsvRow */ const char **CsvParser_getFields(const CsvRow *csvRow); /* Get the error message, for the last occurred error Returns an c-string csvParser - an instance of CsvParser */ const char* CsvParser_getErrorMessage(CsvParser *csvParser); /* Destroy and release memory of a CsvParser instance csvParser - an instance of CsvParser */ void CsvParser_destroy(CsvParser *csvParser); /* Destroy and release memory of a CsvRow instance csvRow - an instance of CsvRow */ void CsvParser_destroy_row(CsvRow *csvRow);