int readStdLine(Project* project, char *line, DateTime day1, DateTime day2) // // Input: line = line of data from a standard rainfall data file // day1 = starting day of record of interest // day2 = ending day of record of interest // Output: returns -1 if past end of desired record, 0 if data line could // not be read successfully or 1 if line read successfully // Purpose: reads a line of data from a standard rainfall data file and // writes its data to the rain interface file. // { DateTime date1; DateTime date2; int year, month, day, hour, minute; float x; // --- parse data from input line if (!parseStdLine(project,line, &year, &month, &day, &hour, &minute, &x)) return 0; // --- see if date is within period of record requested date1 = datetime_encodeDate(year, month, day); if ( day1 != NO_DATE && date1 < day1 ) return 0; if ( day2 != NO_DATE && date1 > day2 ) return -1; // --- see if record is out of sequence date2 = date1 + datetime_encodeTime(hour, minute, 0); if ( date2 <= project->PreviousDate ) { report_writeErrorMsg(project,ERR_RAIN_FILE_SEQUENCE, project->Gage[project->GageIndex].fname); //(5.1.010) report_writeLine(project,line); return -1; } project->PreviousDate = date2; switch (project->RainType) { case RAINFALL_INTENSITY: x = x * project->Interval / 3600.0f; break; case CUMULATIVE_RAINFALL: if ( x >= project->RainAccum ) { x = x - project->RainAccum; project->RainAccum += x; } else project->RainAccum = x; break; } x *= (float)project->UnitsFactor; // --- save rainfall to binary interface file saveRainfall(project, date1, hour, minute, x, FALSE); return 1; }
int readStdLine(char *line, DateTime day1, DateTime day2) // // Input: line = line of data from a standard rainfall data file // day1 = starting day of record of interest // day2 = ending day of record of interest // Output: returns -1 if past end of desired record, 0 if data line could // not be read successfully or 1 if line read successfully // Purpose: reads a line of data from a standard rainfall data file and // writes its data to the rain interface file. // { DateTime date1; int year, month, day, hour, minute; float x; // --- parse data from input line if (!parseStdLine(line, &year, &month, &day, &hour, &minute, &x)) return 0; // --- see if date is within period of record requested date1 = datetime_encodeDate(year, month, day); if ( day1 != NO_DATE && date1 < day1 ) return 0; if ( day2 != NO_DATE && date1 > day2 ) return -1; switch (RainType) { case RAINFALL_INTENSITY: x = x * Interval / 3600.0; break; case CUMULATIVE_RAINFALL: if ( x >= RainAccum ) { x = x - RainAccum; RainAccum += x; } else RainAccum = x; break; } x *= UnitsFactor; // --- save rainfall to binary interface file saveRainfall(date1, hour, minute, x, FALSE); return 1; }
int readCMCLine(Project* project, char *line, int fileFormat, DateTime day1, DateTime day2) // // Input: line = line of data from rainfall data file // fileFormat = code of data file's format // day1 = starting day of record of interest // day2 = ending day of record of interest // Output: returns -1 if past end of desired record, 0 if data line could // not be read successfully or 1 if line read successfully // Purpose: reads a line of data from an AES or CMC rainfall data file and // writes its data to the rain interface file. // { char flag, isMissing; DateTime date1; long sn, v; int col, j, jMax, elem, y, m, d, hour, minute; float x; // --- get year, month, day & element code from line if ( fileFormat == AES_HLY ) { if ( sscanf(line, "%7ld%3d%2d%2d%3d", &sn, &y, &m, &d, &elem) < 5 ) return 0; if ( y < 100 ) y = y + 2000; else y = y + 1000; col = 17; } else { if ( sscanf(line, "%7ld%4d%2d%2d%3d", &sn, &y, &m, &d, &elem) < 5 ) return 0; col = 18; } // --- see if date is within period of record requested date1 = datetime_encodeDate(y, m, d); if ( day1 != NO_DATE && date1 < day1 ) return 0; if ( day2 != NO_DATE && date1 > day2 ) return -1; // --- make sure element code is for rainfall if ( fileFormat == AES_HLY && elem != 123 ) return 0; else if ( fileFormat == CMC_FIF && elem != 159 ) return 0; else if ( fileFormat == CMC_HLY && elem != 123 ) return 0; // --- read rainfall from each recording interval hour = 0; // starting hour minute = 0; // starting minute jMax = 24; // # recording intervals if ( fileFormat == CMC_FIF ) jMax = 96; for (j=1; j<=jMax; j++) { if ( sscanf(&line[col], "%6ld%c", &v, &flag) < 2 ) return 0; col += 7; if ( v == -99999 ) isMissing = TRUE; else isMissing = FALSE; // --- convert rain measurement from 0.1 mm to inches and save it x = (float)( (double)v / 10.0 / MMperINCH); if ( x > 0 || isMissing) { saveRainfall(project,date1, hour, minute, x, isMissing); } // --- update hour & minute for next interval if ( fileFormat == CMC_FIF ) { minute += 15; if ( minute == 60 ) { minute = 0; hour++; } } else hour++; } return 1; }
int readNWSLine(Project* project, char *line, int fileFormat, DateTime day1, DateTime day2) // // Input: line = line of data from rainfall data file // fileFormat = code of data file's format // day1 = starting day of record of interest // day2 = ending day of record of interest // Output: returns -1 if past end of desired record, 0 if data line could // not be read successfully or 1 if line read successfully // Purpose: reads a line of data from a rainfall data file and writes its // data to the rain interface file. // { char flag1, flag2, isMissing; DateTime date1; long result = 1; int k, y, m, d, n; int hour, minute; long v; float x; int lineLength = strlen(line)-1; int nameLength = 0; // --- get year, month, & day from line switch ( fileFormat ) { case NWS_TAPE: if ( lineLength <= 30 ) return 0; if (sscanf(&line[17], "%4d%2d%4d%3d", &y, &m, &d, &n) < 4) return 0; k = 30; break; case NWS_SPACE_DELIMITED: if ( project->hasStationName ) nameLength = 31; if ( lineLength <= 28 + nameLength ) return 0; k = 18 + nameLength; if (sscanf(&line[k], "%4d %2d %2d", &y, &m, &d) < 3) return 0; k = k + 10; break; case NWS_COMMA_DELIMITED: if ( lineLength <= 28 ) return 0; if ( sscanf(&line[18], "%4d,%2d,%2d", &y, &m, &d) < 3 ) return 0; k = 28; break; case NWS_ONLINE_60: case NWS_ONLINE_15: if ( lineLength <= project->DataOffset + 23 ) return 0; if ( sscanf(&line[project->DataOffset], "%4d%2d%2d", &y, &m, &d) < 3 ) return 0; k = project->DataOffset + 8; break; default: return 0; } // --- see if date is within period of record requested date1 = datetime_encodeDate(y, m, d); if ( day1 != NO_DATE && date1 < day1 ) return 0; if ( day2 != NO_DATE && date1 > day2 ) return -1; // --- read each recorded rainfall time, value, & codes from line while ( k < lineLength ) { flag1 = 0; flag2 = 0; v = 99999; hour = 25; minute = 0; switch ( fileFormat ) { case NWS_TAPE: n = sscanf(&line[k], "%2d%2d%6ld%c%c", &hour, &minute, &v, &flag1, &flag2); k += 12; break; case NWS_SPACE_DELIMITED: n = sscanf(&line[k], " %2d%2d %6ld %c %c", &hour, &minute, &v, &flag1, &flag2); k += 16; break; case NWS_COMMA_DELIMITED: n = sscanf(&line[k], ",%2d%2d,%6ld,%c,%c", &hour, &minute, &v, &flag1, &flag2); k += 16; break; case NWS_ONLINE_60: case NWS_ONLINE_15: n = sscanf(&line[k], " %2d:%2d", &hour, &minute); n += sscanf(&line[project->ValueOffset], "%8ld %c", &v, &flag1); // --- ending hour 0 is really hour 24 of previous day if ( hour == 0 ) { hour = 24; date1 -= 1.0; } k += lineLength; break; default: n = 0; } // --- check that we at least have an hour, minute & value // (codes might be left off of the line) if ( n < 3 || hour >= 25 ) break; // --- set special condition code & update daily & hourly counts setCondition(project,flag1); if ( project->Condition == DELETED_PERIOD || project->Condition == MISSING_PERIOD || flag1 == 'M' ) isMissing = TRUE; else if ( v >= 9999 ) isMissing = TRUE; else isMissing = FALSE; // --- handle accumulation codes if ( flag1 == 'a' ) { project->AccumStartDate = date1 + datetime_encodeTime(hour, minute, 0); } else if ( flag1 == 'A' ) { saveAccumRainfall(project,date1, hour, minute, v); } // --- handle all other conditions else { // --- convert rain measurement to inches & save it x = (float)v / 100.0f; if ( x > 0 || isMissing ) saveRainfall(project,date1, hour, minute, x, isMissing); } // --- reset condition code if special condition period ended if ( flag1 == 'A' || flag1 == '}' || flag1 == ']') project->Condition = 0; } return result; }
int readNWSLine(char *line, int fileFormat, DateTime day1, DateTime day2) // // Input: line = line of data from rainfall data file // fileFormat = code of data file's format // day1 = starting day of record of interest // day2 = ending day of record of interest // Output: returns -1 if past end of desired record, 0 if data line could // not be read successfully or 1 if line read successfully // Purpose: reads a line of data from a rainfall data file and writes its // data to the rain interface file. // { char flag1, flag2, isMissing; DateTime date1; long result = 1; int k, y, m, d, n; int hour, minute; long v; float x; int lineLength = strlen(line)-1; // --- get year, month, & day from line switch ( fileFormat ) { case NWS_TAPE: if ( lineLength <= 30 ) return 0; if (sscanf(&line[17], "%4d%2d%4d%3d", &y, &m, &d, &n) < 4) return 0; k = 30; break; case NWS_SPACE_DELIMITED: if ( lineLength <= 28 ) return 0; if (sscanf(&line[18], "%4d %2d %2d", &y, &m, &d) < 3) return 0; k = 28; break; case NWS_COMMA_DELIMITED: if ( lineLength <= 28 ) return 0; if ( sscanf(&line[18], "%4d,%2d,%2d", &y, &m, &d) < 3 ) return 0; k = 28; break; default: return 0; } // --- see if date is within period of record requested date1 = datetime_encodeDate(y, m, d); if ( day1 != NO_DATE && date1 < day1 ) return 0; if ( day2 != NO_DATE && date1 > day2 ) return -1; // --- read each recorded rainfall time, value, & codes from line while ( k < lineLength ) { switch ( fileFormat ) { case NWS_TAPE: n = sscanf(&line[k], "%2d%2d%6d%c%c", &hour, &minute, &v, &flag1, &flag2); k += 12; break; case NWS_SPACE_DELIMITED: n = sscanf(&line[k], " %2d%2d %6d %c %c", &hour, &minute, &v, &flag1, &flag2); k += 16; break; case NWS_COMMA_DELIMITED: n = sscanf(&line[k], ",%2d%2d,%6d,%c,%c", &hour, &minute, &v, &flag1, &flag2); k += 16; break; } if ( n < 5 || hour >= 25 ) break; // --- set special condition code & update daily & hourly counts setCondition(flag1); if ( Condition != NO_CONDITION ) isMissing = TRUE; else if ( v == 99999 ) isMissing = TRUE; else isMissing = FALSE; // --- convert rain measurement from hundreth's of an inch & save it x = (float)v / 100.0; if ( x > 0 ) saveRainfall(date1, hour, minute, x, isMissing); // --- reset condition code if special condition period ended if ( flag1 == 'A' || flag1 == '}' || flag1 == ']') Condition = 0; } return result; }