#!/free/bin/perl # # General routine to read & write MEDS ASCII # Structured to allow code to be added to do counts, spit out # a special record, or whatever is needed. # # !!! NOTE HOWEVER that this program ASSUMES THAT THE FILE HAS PROPER # MEDS ASCII STRUCTURE !!! # !!! BE SURE TO RUN TESTMEDS FIRST !!! # (Bad MKeys are OK; just no structural errors -- Testmeds errors 14, 27, 29) # # #Parseobs enables parsing of obs record; set to 0 to save processing time $parseobs = 1; $file = $ARGV[0]; if (length($file) == 0) { print "\nThis program must be invoked with one command line parameter,\n"; print "which must be the name of a GTSPP-MEDS-ASCII file. This program\n"; print "does no checking of proper format, but assumes the format is good.\n"; print "Use testmeds.pl to check the file first, don't use this program\n"; print "with a file that has error types 14, 27, or 29.\n"; print "\nAs is, this program will essentially copy a MEDS-ASCII file.\n"; print "It is assumed that this program will be customized for special\n"; print "purposes by writing custom code between the calls to the read and\n"; print "write routines. The write routine sends output to STDOUT, so to\n"; print "make another MEDS-ASCII file, divert output to a file.\n\n"; $file = '(No filename provided)'; } open(INFILE, $file) || die "Can't open input file '$file': $!\n"; while () { s/[\012\015]+$//; # Remove EOL characters &readsta; # do something &writesta; } close INFILE; # End of main program ####### sub readsta { # $rec = 0; $seg = 0; $line++; $reccount++; $MKey = substr($_, 0, 8); $One_Deg_sq = substr($_, 8, 8); $Cruise_ID = substr($_, 16, 10); $Obs_Year = substr($_, 26, 4); $Obs_Month = substr($_, 30, 2); $Obs_Day = substr($_, 32, 2); $Obs_Time = substr($_, 34, 4); $Data_Type = substr($_, 38, 2); $Iumsgno = substr($_, 40, 12); $Stream_Source = substr($_, 52, 1); $Uflag = substr($_, 53, 1); $MEDS_Sta = substr($_, 54, 8); $Latitude = substr($_, 62, 8); $Longitude = substr($_, 70, 9); $Q_Pos = substr($_, 79, 1); $Q_Date_Time = substr($_, 80, 1); $Q_Record = substr($_, 81, 1); $Up_Date = substr($_, 82, 8); $Bul_Time = substr($_, 90, 12); $Bul_Header = substr($_, 102, 6); $Source_ID = substr($_, 108, 4); $Stream_Ident = substr($_, 112, 4); $QC_Version = substr($_, 116, 4); $Data_Avail = substr($_, 120, 1); $No_Prof = substr($_, 121, 2); $Nparms = substr($_, 123, 2); $Nsurfc = substr($_, 125, 2); $Num_Hists = substr($_, 127, 3); # # $B = 130; for ($n = 1; $n <= $No_Prof; $n++) { $Prof_Inf[$n] = substr($_, $B, 14); $B += 14; $No_Seg[$n] = substr($Prof_Inf[$n], 0, 2); $Prof_Type[$n] = substr($Prof_Inf[$n], 2, 4); $Dup_flag[$n] = substr($Prof_Inf[$n], 6, 1); $Digit_Code[$n] = substr($Prof_Inf[$n], 7, 1); $Standard[$n] = substr($Prof_Inf[$n], 8, 1); $Deep_Depth[$n] = substr($Prof_Inf[$n], 9, 5); } # for ($n = 1; $n <= $Nparms; $n++) { $SPGp[$n] = substr($_, $B, 15); $B += 15; $Pcode[$n] = substr($SPGp[$n], 0, 4); $Parm[$n] = substr($SPGp[$n], 4, 10); $Q_Parm[$n] = substr($SPGp[$n], 14, 1); } # $DBID = " "; for ($n = 1; $n <= $Nsurfc; $n++) { $SCGp[$n] = substr($_, $B, 15); $B += 15; $SRFC_Code[$n] = substr($SCGp[$n], 0, 4); $SRFC_Parm[$n] = substr($SCGp[$n], 4, 10); $SRFC_Q_Parm[$n] = substr($SCGp[$n], 14, 1); if ($SRFC_Code[$n] eq "DBID") {$DBID = $SRFC_Parm[$n];} } # for ($n = 1; $n <= $Num_Hists; $n++) { $HGp[$n] = substr($_, $B, 42); $B += 42; $Ident_Code[$n] = substr($HGp[$n], 0, 2); $PRC_Code[$n] = substr($HGp[$n], 2, 4); $Version[$n] = substr($HGp[$n], 6, 4); $PRC_Date[$n] = substr($HGp[$n], 10, 8); $Act_Code[$n] = substr($HGp[$n], 18, 2); $Act_Parm[$n] = substr($HGp[$n], 20, 4); $Aux_ID[$n] = substr($HGp[$n], 24, 8); $Previous_Val[$n] = substr($HGp[$n], 32, 10); } # for ($rec = 1; $rec <= $No_Prof; $rec++) { for ($seg = 1; $seg <= $No_Seg[$rec]; $seg++) { $_ = ; s/[\012\015]+$//; # Remove EOL characters $dataline[$rec][$seg] = $_; if ($parseobs == 1) { $line++; $MKey_r[$rec][$seg] = substr($_, 0, 8); $One_Deg_sq[$rec][$seg] = substr($_, 8, 8); $Cruise_ID[$rec][$seg] = substr($_, 16, 10); $Obs_Year[$rec][$seg] = substr($_, 26, 4); $Obs_Month[$rec][$seg] = substr($_, 30, 2); $Obs_Day[$rec][$seg] = substr($_, 32, 2); $Obs_Time[$rec][$seg] = substr($_, 34, 4); $Data_Type[$rec][$seg] = substr($_, 38, 2); $Iumsgno[$rec][$seg] = substr($_, 40, 12); $Profile_Type[$rec][$seg] = substr($_, 52, 4); $Profile_Seg[$rec][$seg] = substr($_, 56, 2); $No_Depths[$rec][$seg] = substr($_, 58, 4); $D_P_Code[$rec][$seg] = substr($_, 62, 1); # $B = 63; for ($d = 1; $d <= $No_Depths[$rec][$seg]; $d++) { $DepPres[$rec][$seg][$d] = substr($_, $B, 6); $B += 6; $Pdpq[$rec][$seg][$d] = substr($_, $B, 1); $B += 1; $Pval[$rec][$seg][$d] = substr($_, $B, 9); $B += 9; $Ppvq[$rec][$seg][$d] = substr($_, $B, 1); $B += 1; } } } } } ####### sub writesta { # print $MKey, $One_Deg_sq, $Cruise_ID, $Obs_Year, $Obs_Month, $Obs_Day, $Obs_Time, $Data_Type, $Iumsgno, $Stream_Source, $Uflag, $MEDS_Sta, $Latitude, $Longitude, $Q_Pos, $Q_Date_Time, $Q_Record, $Up_Date, $Bul_Time, $Bul_Header, $Source_ID, $Stream_Ident, $QC_Version, $Data_Avail, $No_Prof, $Nparms, $Nsurfc, $Num_Hists; # for ($n = 1; $n <= $No_Prof; $n++) { print $No_Seg[$n], $Prof_Type[$n], $Dup_flag[$n], $Digit_Code[$n], $Standard[$n], $Deep_Depth[$n]; } # for ($n = 1; $n <= $Nparms; $n++) { print $Pcode[$n], $Parm[$n], $Q_Parm[$n]; } # for ($n = 1; $n <= $Nsurfc; $n++) { print $SRFC_Code[$n], $SRFC_Parm[$n], $SRFC_Q_Parm[$n]; } # for ($n = 1; $n <= $Num_Hists; $n++) { print $Ident_Code[$n], $PRC_Code[$n], $Version[$n], $PRC_Date[$n], $Act_Code[$n], $Act_Parm[$n], $Aux_ID[$n], $Previous_Val[$n]; } # print "\n"; # for ($rec = 1; $rec <= $No_Prof; $rec++) { for ($seg = 1; $seg <= $No_Seg[$rec]; $seg++) { if ($parseobs != 1) {print $dataline[$rec][$seg], "\n";} if ($parseobs == 1) { print $MKey_r[$rec][$seg], $One_Deg_sq[$rec][$seg], $Cruise_ID[$rec][$seg], $Obs_Year[$rec][$seg], $Obs_Month[$rec][$seg], $Obs_Day[$rec][$seg], $Obs_Time[$rec][$seg], $Data_Type[$rec][$seg], $Iumsgno[$rec][$seg], $Profile_Type[$rec][$seg], $Profile_Seg[$rec][$seg], $No_Depths[$rec][$seg], $D_P_Code[$rec][$seg]; # for ($d = 1; $d <= $No_Depths[$rec][$seg]; $d++) { print $DepPres[$rec][$seg][$d], $Pdpq[$rec][$seg][$d], $Pval[$rec][$seg][$d], $Ppvq[$rec][$seg][$d]; } print "\n"; } } } }