int main() { int i = 0; // file, delimiter, first_line_is_header? CsvParser *csvparser = CsvParser_new("example_file_with_header.csv", ",", 1); CsvRow *header; CsvRow *row; 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]); } // Do NOT destroy the headear manually if you plan to destroy the parser later. // If you destroy both header and parser, you will get double free runtime error // CsvParser_destroy_row(header); 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]); } printf("\n"); CsvParser_destroy_row(row); } CsvParser_destroy(csvparser); return 0; }
void Trajectory::LoadMatrixFromCSV( const std::string& filename, Eigen::MatrixXd &matrix) { cout << "Loading " << filename << endl; int number_of_lines = GetNumberOfLines(filename); int row_num = 0; int i = 0; // file, delimiter, first_line_is_header? CsvParser *csvparser = CsvParser_new(filename.c_str(), ",", true); CsvRow *header; CsvRow *row; header = CsvParser_getHeader(csvparser); if (header == NULL) { printf("%s\n", CsvParser_getErrorMessage(csvparser)); return; } char **headerFields = CsvParser_getFields(header); for (i = 0 ; i < CsvParser_getNumFields(header) ; i++) { //printf("TITLE: %s\n", headerFields[i]); } matrix.resize(number_of_lines - 1, i); // minus 1 for header, i = number of columns while ((row = CsvParser_getRow(csvparser)) ) { //printf("NEW LINE:\n"); char **rowFields = CsvParser_getFields(row); for (i = 0 ; i < CsvParser_getNumFields(row) ; i++) { matrix(row_num, i) = atof(rowFields[i]); //printf("FIELD: %20.20f\n", atof(rowFields[i])); } CsvParser_destroy_row(row); if (row_num == 1) { dt_ = matrix(1, 0) - matrix(0, 0); } else if (row_num > 1) { if (matrix(row_num, 0) - matrix(row_num - 1, 0) - dt_ > 5*std::numeric_limits<double>::epsilon()) { cerr << "Error: non-constant dt. Expected dt = " << dt_ << " but got matrix[" << row_num << "][0] - matrix[" << row_num - 1 << "][0] = " << matrix(row_num, 0) - matrix(row_num - 1, 0) << " (residual = " << (matrix(row_num, 0) - matrix(row_num - 1, 0) - dt_) << endl; cout << matrix << endl; exit(1); } } row_num ++; } CsvParser_destroy(csvparser); }
void CsvParser_destroy(CsvParser *csvParser) { if (csvParser == NULL) { return; } if (csvParser->filePath_ != NULL) { free(csvParser->filePath_); } if (csvParser->errMsg_ != NULL) { free(csvParser->errMsg_); } if (csvParser->fileHandler_ != NULL) { fclose(csvParser->fileHandler_); } if (csvParser->header_ != NULL) { CsvParser_destroy_row(csvParser->header_); } if (csvParser->csvString_ != NULL) { free(csvParser->csvString_); } free(csvParser); }
CsvRow *_CsvParser_getRow(CsvParser *csvParser) { int numRowRealloc = 0; int acceptedFields = 64; int acceptedCharsInField = 64; if (csvParser->filePath_ == NULL && (! csvParser->fromString_)) { _CsvParser_setErrorMessage(csvParser, "Supplied CSV file path is NULL"); return NULL; } if (csvParser->csvString_ == NULL && csvParser->fromString_) { _CsvParser_setErrorMessage(csvParser, "Supplied CSV string is NULL"); return NULL; } if (csvParser->delimiter_ == '\0') { _CsvParser_setErrorMessage(csvParser, "Supplied delimiter is not supported"); return NULL; } if (! csvParser->fromString_) { if (csvParser->fileHandler_ == NULL) { csvParser->fileHandler_ = fopen(csvParser->filePath_, "r"); if (csvParser->fileHandler_ == NULL) { int errorNum = errno; const char *errStr = strerror(errorNum); char *errMsg = (char*)malloc(1024 + strlen(errStr)); strcpy(errMsg, ""); sprintf(errMsg, "Error opening CSV file for reading: %s : %s", csvParser->filePath_, errStr); _CsvParser_setErrorMessage(csvParser, errMsg); free(errMsg); return NULL; } } } CsvRow *csvRow = (CsvRow*)malloc(sizeof(CsvRow)); csvRow->fields_ = (char**)malloc(acceptedFields * sizeof(char*)); csvRow->numOfFields_ = 0; int fieldIter = 0; char *currField = (char*)malloc(acceptedCharsInField); int inside_complex_field = 0; int currFieldCharIter = 0; int seriesOfQuotesLength = 0; int lastCharIsQuote = 0; int isEndOfFile = 0; while (1) { char currChar = (csvParser->fromString_) ? csvParser->csvString_[csvParser->csvStringIter_] : fgetc(csvParser->fileHandler_); csvParser->csvStringIter_++; int endOfFileIndicator; if (csvParser->fromString_) { endOfFileIndicator = (currChar == '\0'); } else { endOfFileIndicator = feof(csvParser->fileHandler_); } if (endOfFileIndicator) { if (currFieldCharIter == 0 && fieldIter == 0) { _CsvParser_setErrorMessage(csvParser, "Reached EOF"); free(currField); CsvParser_destroy_row(csvRow); return NULL; } currChar = '\n'; isEndOfFile = 1; } if (currChar == '\r') { continue; } if (currFieldCharIter == 0 && ! lastCharIsQuote) { if (currChar == '\"') { inside_complex_field = 1; lastCharIsQuote = 1; continue; } } else if (currChar == '\"') { seriesOfQuotesLength++; inside_complex_field = (seriesOfQuotesLength % 2 == 0); if (inside_complex_field) { currFieldCharIter--; } } else { seriesOfQuotesLength = 0; } if (isEndOfFile || ((currChar == csvParser->delimiter_ || currChar == '\n') && ! inside_complex_field) ){ currField[lastCharIsQuote ? currFieldCharIter - 1 : currFieldCharIter] = '\0'; csvRow->fields_[fieldIter] = (char*)malloc(currFieldCharIter + 1); strcpy(csvRow->fields_[fieldIter], currField); free(currField); csvRow->numOfFields_++; if (currChar == '\n') { return csvRow; } if (csvRow->numOfFields_ != 0 && csvRow->numOfFields_ % acceptedFields == 0) { csvRow->fields_ = (char**)realloc(csvRow->fields_, ((numRowRealloc + 2) * acceptedFields) * sizeof(char*)); numRowRealloc++; } acceptedCharsInField = 64; currField = (char*)malloc(acceptedCharsInField); currFieldCharIter = 0; fieldIter++; inside_complex_field = 0; } else { currField[currFieldCharIter] = currChar; currFieldCharIter++; if (currFieldCharIter == acceptedCharsInField - 1) { acceptedCharsInField *= 2; currField = (char*)realloc(currField, acceptedCharsInField); } } lastCharIsQuote = (currChar == '\"') ? 1 : 0; } }