diff --git a/lib/formats/csv.c b/lib/formats/csv.c index 837767f48..e878696a6 100644 --- a/lib/formats/csv.c +++ b/lib/formats/csv.c @@ -106,16 +106,31 @@ static size_t csv_sscan_single(struct io *io, const char *buf, size_t len, struc if (*end == io->delimiter) goto out; - switch (s->format & (1 << s->length)) { - case SAMPLE_DATA_FORMAT_FLOAT: - s->data[s->length].f = strtod(ptr, &end); - break; - case SAMPLE_DATA_FORMAT_INT: - s->data[s->length].i = strtol(ptr, &end, 10); - break; + //determine format (int or double) of current number starting at ptr + char * next_seperator = strchr(ptr, io->separator); + if(next_seperator == NULL){ + //the last element of a row + next_seperator = strchr(ptr, io->delimiter); } - /* There are no valid FP values anymore. */ + char *number = malloc(next_seperator - ptr); + strncpy(number, ptr, next_seperator-ptr); + char * contains_dot = strstr(number, "."); + if(contains_dot == NULL){ + //no dot in string number --> number is an integer + s->data[s->length].i = strtol(ptr, &end, 10); + sample_set_data_format(s, s->length, SAMPLE_DATA_FORMAT_INT); + } + + else{ + //dot in string number --> number is a floating point value + s->data[s->length].f = strtod(ptr, &end); + sample_set_data_format(s, s->length, SAMPLE_DATA_FORMAT_FLOAT); + } + free(number); + + + /* There are no valid values anymore. */ if (end == ptr) goto out; }