diff options
| author | Tadas Vilkeliskis <vilkeliskis.t@gmail.com> | 2013-10-25 16:34:50 -0400 |
|---|---|---|
| committer | Tadas Vilkeliskis <vilkeliskis.t@gmail.com> | 2013-10-26 19:02:09 -0400 |
| commit | 58f3d912e20abc57c1c68cfc28325a5d58034189 (patch) | |
| tree | 93d93345c09809c606961fd9649cfa43bf1a8a38 /examples/parser.c | |
| parent | ce79f6da73ec063b35d4b0e2f30c44cdf199599c (diff) | |
csv parser
Diffstat (limited to 'examples/parser.c')
| -rw-r--r-- | examples/parser.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/examples/parser.c b/examples/parser.c new file mode 100644 index 0000000..50c30d6 --- /dev/null +++ b/examples/parser.c @@ -0,0 +1,95 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <fcntl.h> +#include <csv_parser.h> + + +typedef struct field_ { + char data[32]; + int row; + int col; + struct field_ *next; +} field_t; + + +typedef struct csv_ { + field_t *head; + field_t *tail; +} csv_t; + + +field_t *new_field(const char *data, size_t length, int row, int col) +{ + field_t *field = malloc(sizeof(field_t)); + memset(field, 0, sizeof(field_t)); + field->row = row; + field->col = col; + strncpy(field->data, data, length); + return field; +} + + +int field_cb(csv_parser_t *parser, const char *data, size_t length, int row, int col) +{ + csv_t *csv = parser->data; + field_t *field; + + if (!csv->tail) { + field = new_field(data, length, row, col); + csv->tail = field; + csv->head = field; + } else { + if (csv->tail->row == row && csv->tail->col == col) { + strncat(csv->tail->data, data, length); + } else { + field = new_field(data, length, row, col); + csv->tail->next = field; + csv->tail = field; + } + } + + return 0; +} + + +int main(int argc, const char *argv[]) +{ + csv_t csv; + field_t *field; + char buffer[64]; + ssize_t nread; + csv_parser_t parser; + csv_parser_settings_t settings; + + csv.head = NULL; + csv.tail = NULL; + + settings.delimiter = ','; + settings.field_cb = field_cb; + + csv_parser_init(&parser); + parser.data = &csv; + + int fd = open("iris.csv", O_RDONLY); + if (fd == -1) { + perror("open"); + return -1; + } + + while ((nread = read(fd, buffer, sizeof(buffer))) > 0) { + csv_parser_execute(&parser, &settings, buffer, nread); + } + + close(fd); + + field = csv.head; + while (field) { + printf("row: %3d, col: %3d, data: %s\n", field->row, field->col, field->data); + field_t *next = field->next; + free(field); + field = next; + } + + return 0; +} |
