Changeset 41340 for trunk/Ohana/src/opihi/cmd.data/read_vectors.c
- Timestamp:
- Apr 16, 2020, 1:54:47 PM (6 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/opihi/cmd.data/read_vectors.c (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/cmd.data/read_vectors.c
r41305 r41340 35 35 36 36 // vector types 37 enum {COLTYPE_NONE, COLTYPE_FLT, COLTYPE_INT, COLTYPE_TIME, COLTYPE_ DATE, COLTYPE_CHAR, COLTYPE_STR, COLTYPE_HMS};37 enum {COLTYPE_NONE, COLTYPE_FLT, COLTYPE_INT, COLTYPE_TIME, COLTYPE_CHAR}; 38 38 39 39 static int Nvec = 0; … … 91 91 gprint (GP_ERR, " -skip N : skip N lines before reading\n"); 92 92 gprint (GP_ERR, " column names may include a type: name:type\n"); 93 gprint (GP_ERR, " type is int, float, char, str, time, date, hms\n");93 gprint (GP_ERR, " type is int, float, char, time\n"); 94 94 gprint (GP_ERR, " for char, values are placed into a list $name:0 - $name:n\n"); 95 gprint (GP_ERR, " for str, values are placed into a string-typed vector\n");96 gprint (GP_ERR, " for hms, values are sexigesimal values HH:MM:SS (good for degrees as well)\n");97 gprint (GP_ERR, " for date, values are human-readable date strings YYYY/MM/DD\n");98 95 gprint (GP_ERR, " for time, values are human-readable date/time strings YYYY/MM/DD,hh:mm:ss\n"); 99 gprint (GP_ERR, " date & time values are stored as a float using the TIMEFORMAT, TIMEREF values for the conversion\n");96 gprint (GP_ERR, " the resulting vector is a float based on the TIMEFORMAT, TIMEREF values\n"); 100 97 101 98 gprint (GP_ERR, " -fits options:\n"); … … 155 152 if (!strcasecmp(ptr, "int")) { coltype[i] = COLTYPE_INT; } 156 153 if (!strcasecmp(ptr, "char")) { coltype[i] = COLTYPE_CHAR; } 157 if (!strcasecmp(ptr, "str")) { coltype[i] = COLTYPE_STR; }158 if (!strcasecmp(ptr, "date")) { coltype[i] = COLTYPE_DATE; }159 154 if (!strcasecmp(ptr, "time")) { coltype[i] = COLTYPE_TIME; } 160 if (!strcasecmp(ptr, "hms")) { coltype[i] = COLTYPE_HMS; }161 155 if (!coltype[i]) goto bad_colname; 162 156 } … … 216 210 break; 217 211 case COLTYPE_FLT: 218 case COLTYPE_HMS:219 212 case COLTYPE_TIME: 220 case COLTYPE_DATE: 213 // note that COLTYPE_TIME is a type of float 221 214 ResetVector (vec[i], OPIHI_FLT, NELEM); 222 break;223 case COLTYPE_STR:224 ResetVector (vec[i], OPIHI_STR, NELEM);225 215 break; 226 216 case COLTYPE_CHAR: … … 297 287 time_t tvalue; 298 288 int readStatus = FALSE; 299 int dataStatus = FALSE;300 289 // need to make the if cases for coltype[i] 301 290 switch (coltype[i]) { … … 322 311 break; 323 312 } 324 case COLTYPE_STR:325 {326 // I need to get an isolated word in 'value' with the string value of this field327 char *ptr = IsCSV ? ptrparse_csv (col[i], c0) : ptrparse (col[i], c0);328 char *value = NULL;329 if (IsCSV) {330 char *end = parse_nextword_csv (ptr);331 if (end) {332 value = end ? strncreate (ptr, end - ptr) : strcreate (ptr);333 }334 } else {335 value = thisword(ptr);336 }337 vec[i][0].elements.Str[Nelem] = value; // needs to be freed later.338 break;339 }340 313 case COLTYPE_FLT: 341 314 readStatus = IsCSV ? dparse_csv (&dvalue, col[i], c0) : dparse (&dvalue, col[i], c0); … … 347 320 vec[i][0].elements.Flt[Nelem] = readStatus ? dvalue : NAN; 348 321 break; 349 case COLTYPE_DATE: {350 char *string = NULL;351 if (IsCSV) {352 char *ptr = ptrparse_csv (col[i], c0);353 string = strcreate (ptr); // create separate string (NULL-safe)354 ptr = (string == NULL) ? NULL : strchr (string, ',');355 if (ptr != NULL) *ptr = 0; // place an EOL here so parsing does not go past the comma356 } else {357 char *ptr = ptrparse (col[i], c0); // NULL-safe358 string = getword (ptr); // NULL-safe359 }360 tvalue = ohana_date_to_sec (string); // NULL-safe (returns 0)361 dvalue = TimeValue (tvalue, TimeReference, TimeFormat);362 vec[i][0].elements.Flt[Nelem] = string ? dvalue : NAN;363 FREE (string);364 break;365 }366 case COLTYPE_HMS: {367 char *ptr = IsCSV ? ptrparse_csv (col[i], c0) : ptrparse (col[i], c0);368 char *string = strcreate (ptr); // make a copy so we can munge it in ohana_dms_to_ddd369 dataStatus = ohana_dms_to_ddd (&dvalue, string);370 vec[i][0].elements.Flt[Nelem] = ((string != NULL) && dataStatus) ? dvalue : NAN;371 FREE (string);372 break;373 }374 322 } 375 323 if (!readStatus && VERBOSE) { … … 397 345 break; 398 346 case COLTYPE_FLT: 399 case COLTYPE_HMS:400 347 case COLTYPE_TIME: 401 case COLTYPE_DATE:402 348 ResetVector (vec[i], OPIHI_FLT, NELEM); 403 break;404 case COLTYPE_STR:405 ResetVector (vec[i], OPIHI_STR, NELEM);406 349 break; 407 350 case COLTYPE_CHAR: … … 423 366 break; 424 367 case COLTYPE_FLT: 425 case COLTYPE_HMS:426 368 case COLTYPE_TIME: 427 case COLTYPE_DATE:428 369 ResetVector (vec[i], OPIHI_FLT, Nelem); 429 break;430 case COLTYPE_STR:431 ResetVector (vec[i], OPIHI_STR, Nelem);432 370 break; 433 371 case COLTYPE_CHAR: … … 531 469 } 532 470 533 // by default, we now store a string-type field as a string-type vector. 534 535 // if CharAsList is selected (and My < 10000), char fields will be saved as $NAME:0 - $NAME:m for m rows 536 537 // if CharAsVectors is selected, char fields will be saved as vectors NAME:0 -- NAME:n for n characters 538 471 // if CharAsVectors, char fields will be saved as vectors NAME:0 -- NAME:n for n characters 472 // else char fields will be saved as $NAME:0 - $NAME:m for m rows 539 473 // if (Ny > 10000), force CharAsVectors 540 474 int CharAsVectors = FALSE; … … 542 476 remove_argument (N, &argc, argv); 543 477 CharAsVectors = TRUE; 544 }545 int CharAsList = FALSE;546 if ((N = get_argument (argc, argv, "-char-list"))) {547 remove_argument (N, &argc, argv);548 CharAsList = TRUE;549 478 } 550 479 … … 722 651 if (!FITS_TRANSPOSE) { 723 652 // read string column into a list rather than a vector 724 if (!strcmp (type, "char")) { 725 // save char-type field as a List: 726 if (CharAsList && (Ny < 3000)) { 727 char *fieldName = argv[i]; 728 char *Ptr = data; 729 char varname[1024]; // used as a buffer for the names of string fields 730 for (j = 0; j < Ny; j++) { 731 set_list_varname (varname, fieldName, j, FALSE); 732 char *value = strncreate (&Ptr[j*Nval], Nval); 733 // replace instances of $ with _ 734 char *p = strchr (value, '$'); 735 while (p) { 736 *p = '_'; 737 p = strchr (p, '$'); 738 } 739 set_str_variable (varname, value); 740 free (value); 653 if (!strcmp (type, "char") && !CharAsVectors && (Ny < 3000)) { 654 char *fieldName = argv[i]; 655 char *Ptr = data; 656 char varname[1024]; // used as a buffer for the names of string fields 657 for (j = 0; j < Ny; j++) { 658 set_list_varname (varname, fieldName, j, FALSE); 659 char *value = strncreate (&Ptr[j*Nval], Nval); 660 // replace instances of $ with _ 661 char *p = strchr (value, '$'); 662 while (p) { 663 *p = '_'; 664 p = strchr (p, '$'); 741 665 } 742 sprintf (varname, "%s:n", fieldName); 743 set_int_variable (varname, Ny); 744 continue; 666 set_str_variable (varname, value); 667 free (value); 745 668 } 746 // save char-type field as a string-type vector: 747 if (!CharAsVectors) { 748 Vector *myVector = NULL; 749 sprintf (name, "%s", argv[i]); 750 if ((myVector = SelectVector (name, ANYVECTOR, TRUE)) == NULL) ESCAPE ("bad vector name\n"); 751 ResetVector (myVector, OPIHI_STR, Ny); 752 753 char *Ptr = data; 754 for (j = 0; j < Ny; j++) { 755 myVector[0].elements.Str[j] = strncreate (&Ptr[j*Nval], Nval); 756 // replace instances of $ with _ 757 char *p = strchr (myVector[0].elements.Str[j], '$'); 758 while (p) { *p = '_'; p = strchr (p, '$'); } 759 } 760 continue; 761 } 669 sprintf (varname, "%s:n", fieldName); 670 set_int_variable (varname, Ny); 671 continue; 762 672 } 763 673 764 674 // define the multifield vector names (Nval vectors x Ny elements) 765 // CharAsVectors is handled below automatically766 675 ALLOCATE (vec, Vector *, Nval); 767 676 for (j = 0; j < Nval; j++) {
Note:
See TracChangeset
for help on using the changeset viewer.
