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; }
CsvParser *CsvParser_new_from_string(const char *csvString, const char *delimiter, int firstLineIsHeader) { CsvParser *csvParser = CsvParser_new(NULL, delimiter, firstLineIsHeader); csvParser->fromString_ = 1; if (csvString != NULL) { int csvStringLen = strlen(csvString); csvParser->csvString_ = (char*)malloc(csvStringLen + 1); strcpy(csvParser->csvString_, csvString); } return csvParser; }
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); }