58 double (*str_to_dbl)(
const char *strval,
int *status))
62 for (mi = 0; map[mi].
csv_name; ++mi) {
63 if (strcmp(csv_name, map[mi].csv_name) == 0) {
102 if (csv_count <= 0 ||
103 csv_count > csv->
nrecs - csv_start) {
105 csv_count = csv->
nrecs - csv_start;
108 indexes = (
int *)calloc(csv_count,
sizeof(
int));
112 "Memory allocation error creating CSV to CDS mapping index\n");
119 for (ri = 0, idx = csv_start; ri < csv_count; ++ri, ++idx) {
124 csv, indexes, csv_count, map, cds, cds_start, flags);
134 #define CSV_MAP_TO_CDS(data_t, data_p, miss_p, ato_func) \
136 for (ri = 0; ri < csv_count; ++ri) { \
137 csvi = csv_indexes[ri]; \
139 if (!csv_strvals[csvi] || *csv_strvals[csvi] == '\0') { \
142 else if (csv_missings) { \
143 for (mvi = 0; csv_missings[mvi]; ++mvi) { \
144 if (strcmp(csv_strvals[csvi], csv_missings[mvi]) == 0) { \
151 *data_p++ = *miss_p; \
154 for (smi = 0; csv_str_map[smi].strval; ++smi) { \
155 if (strcasecmp(csv_strvals[csvi], csv_str_map[smi].strval) == 0) { \
156 *data_p++ = (data_t)csv_str_map[smi].dblval; \
160 if (!csv_str_map[smi].strval) { \
161 ERROR( DSPROC_LIB_NAME, \
162 "Invalid '%s' value '%s' in file: %s\n", \
163 csv_name, csv_strvals[csvi], csv->file_name); \
164 dsproc_set_status(DSPROC_ECSV2CDS); \
170 else if (csv_str_to_dbl) { \
171 for (ri = 0; ri < csv_count; ++ri) { \
172 csvi = csv_indexes[ri]; \
174 if (!csv_strvals[csvi] || *csv_strvals[csvi] == '\0') { \
177 else if (csv_missings) { \
178 for (mvi = 0; csv_missings[mvi]; ++mvi) { \
179 if (strcmp(csv_strvals[csvi], csv_missings[mvi]) == 0) { \
186 *data_p++ = *miss_p; \
189 *data_p++ = (data_t)csv_str_to_dbl(csv_strvals[csvi], &status); \
191 ERROR( DSPROC_LIB_NAME, \
192 "Invalid '%s' value '%s' in file: %s\n", \
193 csv_name, csv_strvals[csvi], csv->file_name); \
194 dsproc_set_status(DSPROC_ECSV2CDS); \
201 for (ri = 0; ri < csv_count; ++ri) { \
202 csvi = csv_indexes[ri]; \
204 if (!csv_strvals[csvi] || *csv_strvals[csvi] == '\0') { \
207 else if (csv_missings) { \
208 for (mvi = 0; csv_missings[mvi]; ++mvi) { \
209 if (strcmp(csv_strvals[csvi], csv_missings[mvi]) == 0) { \
216 *data_p++ = *miss_p; \
219 *data_p++ = (data_t)ato_func(csv_strvals[csvi]); \
251 const char *csv_name;
252 const char *csv_units;
253 const char **csv_missings;
255 double (*csv_str_to_dbl)(
const char *strval,
int *status);
257 const char *csv_strval,
258 const char **csv_missings,
260 size_t cds_sample_size,
264 const char *cds_name;
265 const char *cds_units;
269 void *cds_data_start;
279 int mi, mvi, ri, smi, csvi;
283 cds_units = (
const char *)NULL;
286 "Mapping input CSV data to output dataset variables\n"
287 " - input file: %s\n"
288 " - start index: %d\n"
289 " - num samples: %d\n"
290 " - output dataset: %s\n"
291 " - start index: %d\n",
292 csv->
file_name, csv_indexes[0], csv_count, cds->
name, cds_start);
296 for (mi = 0; map[mi].
csv_name; ++mi) {
317 "Required column '%s' not found in CSV file: %s\n",
328 if (!cds_var && dynamic_dod) {
339 "Could not create time dimension in dataset: %s\n",
352 "Could not create 'time' variable in dataset: %s\n",
380 "Could not create '%s' variable in dataset: %s\n",
409 "Required variable '%s' not found in dataset: %s\n",
410 cds_name, cds->
name);
423 " - * OVERWRITING EXISTING DATA * %s\t-> %s\n",
430 " - * NOT OVERWRITING EXISTING DATA * %s\t-> %s\n",
449 "Could not convert csv units '%s' to cds units '%s'\n",
450 csv_units, cds_units);
460 cds_missing.
vp = (
void *)NULL;
463 if (cds_nmissing < 0) {
466 "Could not get missing value for variable: %s\n"
467 " -> memory allocation error",
475 if (cds_nmissing == 0) {
480 "Could not get missing value for variable: %s\n"
481 " -> missing_value attribute not defined",
489 cds_missing.
vp = calloc(1,
sizeof(
double));
495 if (!skip_debug_msg) {
505 "Memory allocation error mapping CSV dataset to CDS dataset\n");
508 if (cds_missing.
vp) free(cds_missing.
vp);
512 cds_data_start = cds_data.
vp;
518 nbytes = sample_size * type_size;
520 for (ri = 0; ri < csv_count; ++ri) {
522 csvi = csv_indexes[ri];
524 status = csv_set_data(
533 if (cds_missing.
vp) free(cds_missing.
vp);
537 cds_data.
vp += nbytes;
544 for (ri = 0; ri < csv_count; ++ri) {
546 memset(cds_data.
cp, *cds_missing.
cp, sample_size);
548 csvi = csv_indexes[ri];
551 if (!csv_strvals[csvi] || *csv_strvals[csvi] ==
'\0') {
554 else if (csv_missings) {
556 for (mvi = 0; csv_missings[mvi]; ++mvi) {
557 if (strcmp(csv_strvals[csvi], csv_missings[mvi]) == 0) {
565 strncpy(cds_data.
cp, csv_strvals[csvi], sample_size);
568 cds_data.
cp += sample_size;
573 switch (cds_var->
type) {
582 "Could not map CSV data to CDS variable: %s:%s\n"
583 " -> invalid CDSDataType: %d\n",
587 if (cds_missing.
vp) free(cds_missing.
vp);
594 if (unit_converter) {
597 " - converting units: '%s' to '%s'\n",
598 csv_units, cds_units);
604 csv_count * sample_size,
611 NULL, NULL, NULL, NULL);
614 if (cds_missing.
vp) free(cds_missing.
vp);