NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
NOTE: The decoders
mailing list is no longer active. The list archives are made available for historical reasons.
Dan, I found the source of the decoders error message that you sent me awhile back. The sao2nc decoder was using the wrong literal. Attached is the fixed version of sao2nc. Robb... ============================================================================== Robb Kambic Unidata Program Center Software Engineer III Univ. Corp for Atmospheric Research rkambic@xxxxxxxxxxxxxxxx WWW: http://www.unidata.ucar.edu/ ==============================================================================
#! /usr/local/bin/perl # # usage: sao2nc [cdlfile] netcdf # # This sao to netCDF decoder was created by using a sao decoder provided by # Mark Albright as a starting point. Robb Kambic added a netCDF wrapper to # change the output from ascii to netCDF format. # use NetCDF ; # process input parameters if( $#ARGV == 0 ) { $ncfile = $ARGV[ 0 ] ; } elsif( $#ARGV == 1 ) { $cdlfile = $ARGV[ 0 ] ; $ncfile = $ARGV[ 1 ] ; } else { die "Wrong number of parameters " ; } # set interrupt handler $SIG{ 'INT' } = 'cleanup' ; $SIG{ 'TERM' } = 'cleanup' ; $SIG{ 'KILL' } = 'cleanup' ; $SIG{ 'QUIT' } = 'cleanup' ; # default value $F = -9999 ; # change to home chdir() ; chdir( "/home/rkambic/code/decoders/perldec/marka" ) ; # open or create ncfiles if( -e $ncfile ) { $ncid = NetCDF::open( "$ncfile", WRITE ) ; $record_id = NetCDF::dimid( $ncid, "record" ) ; $name_id = "xxxxxx" ; $recnum = -1 ; NetCDF::diminq( $ncid, $record_id, $name_id, $recnum ) ; } else { die "Wrong or missing cdlfile parameter" unless -e $cdlfile ; if( index( $ncfile, '/' ) != -1 ) { $dir = substr( $ncfile, 0, rindex( $ncfile, '/' ) ) ; if( ! -e $dir ) { system( "mkdir -p $dir" ) ; } } if( -e "util/ncgen" ) { $ncgen = "util/ncgen" ; } elsif( -e "/usr/local/ldm/util/ncgen" ) { $ncgen = "/usr/local/ldm/util/ncgen" ; } elsif( -e "/upc/netcdf/bin/ncgen" ) { $ncgen = "/upc/netcdf/bin/ncgen" ; } elsif( -e "./ncgen" ) { $ncgen = "./ncgen" ; } else { open( NCGEN, "which ncgen |" ) ; $ncgen = <NCGEN> ; close( NCGEN ) ; if( $ncgen =~ /no ncgen/ ) { die "Can't find NetCDF utility 'ncgen' in PATH, util/ncgen /usr/local/ldm/util/ncgen, /upc/netcdf/bin/ncgen, or ./ncgen : $!\n" ; } else { $ncgen = "ncgen" ; } } system( "$ncgen -o $ncfile $cdlfile" ) ; $ncid = NetCDF::open( "$ncfile", WRITE ) ; # NetCDF record counter $recnum = 0 ; } # set fill mode NetCDF::setfill($ncid, NetCDF::NOFILL) == 0 || die "Couldn't set fill mode\n"; select( STDOUT ) ; # read in station data if( -e "etc/city_sfc.dat" ) { $sfile = "etc/city_sfc.dat" ; } elsif( -e "./city_sfc.dat" ) { $sfile = "./city_sfc.dat" ; } else { die "Can't file city_sfc.dat station file" ; } open( STATION, "$sfile" ) || die "could not open $sfile: $!\n" ; while( <STATION> ) { @station = split ; @station = reverse( @station ) ; $station[ 4 ] =~ /(\d)/ ; # set these vars ( $lat, $lon, $elev, $priority, $wmo_id ) $STATIONS{ "$station[ 5 ]" } = "$station[ 3 ] $station[ 2 ] $station[ 1 ] $1 $station[ 0 ]" ; } close STATION ; $cover{'SCT'} = 3 ; $cover{'BKN'} = 6 ; $cover{'OVC'} = 8 ; $cover{'0VC'} = 8 ; # Occasionally observers misspell OVC $pre1995 = "" ; # Hard wired to process sao obs from 1995 # Now begin parsing file and decoding observations breaking on cntrl C $/ = "\cC" ; # set select processing here while( 1 ) { open( STDIN, '-' ) ; vec($rin,fileno(STDIN),1) = 1; $timeout = 600 ; $nfound = 0 ; $nfound = select( $rout = $rin, undef, undef, $timeout ); # timed out if( ! $nfound ) { #print "nfound = 0 \n" ; &cleanup() ; } &cleanup() if( eof( STDIN ) ) ; $_ = <STDIN> ; # Process each bulletin s#\cM##g ; s#\cC##g ; if( s/^\s*\001\s*\d\d\d\s+S\w(\w\w)\d{1,2} [CK]\w\w\w \d{2}(\d{2})(\d{2})( RTD\d\d)?\s+//s ) { # Ignore bulletins of Canadian and Mexican hourlies #print "$&\n" ; $header_hr = $2 ; $header_min = $3 ; } else { #print STDERR "Couldn't match header.\n" ; #print STDERR "$_\n\n" ; next ; # Advance to the next bulletin } # Usually reports are separated by a RS character if( /\036/ ) { s/[ \n]RSNK /\036RSNK / ; # Separate RSNK from the HMS report @reports = split ( /\036/ ) ; } elsif( /=\n/ ) { # s/[ \n]RSNK /=RSNK / ; # Separate RSNK from the HMS report @reports = split( /=\n/ ) ; } else { # s/[ \n]RSNK /\nRSNK / ; # Separate RSNK from the HMS report @reports = split ( /\n/ ) ; } for ( @reports ) { # Process each report in the bulletin $raw = $lat = $lon = $elev = $priority = "" ; $id = $type = $hr = $min = $ceiling = $skyc = $vis = $wea = $pres = $t = $td = $wdir = $wspd = $wgst = $alt = $ptend = $deltap = $pcp1 = $pcp3_6 = $xt = $pcp24 = $snow = $tmax = $tmin = $comment = "" ; $ptend_found = $read_cloud = $snowfall = $snowh2o = "" ; $asos = $ramos = $amos = $awos = $correction = $dashx = "" ; $one_inch = $two_inch = $three_inch = "" ; # save original undecoded report $raw = $_ ; # Remove multiple spaces, newlines and trailing = from report s#[\s=\$]+$## ; s#/\n\s*#/ # ; s#\n# #g ; s#\s{2,}# #g ; # s#\s*\n\s*/#/#g ; if( /FINO/ ) { next ; } $hold_report = $_ ; if( s/^(\w{3,4}) (SA|RS|SP|USP) (COR |RTD )?([0-2]\d)([0-5]\d) (COR |RTD )?// ) { $id = $1 ; # if( !($id eq "CNK" || $id eq "ALS" || $id eq "DDC" || $id eq "GLD" )) { # next ; } # These 2 lines used to check ASOS decoding $type = $2 ; $correction = $3 ; $hr = $4 ; $min = $5 ; } elsif( s/^RSNK // ) { # Treat Rattlesnake Mtn. as special case $id = "RSN" ; $type = "SA" ; $hr = $header_hr ; $min = $header_min ; if( s#^([-\d]+)/(\d\d)(\d\d)(G(\d+))?## ) { $t = $1 ; $wdir = $2 ; $wspd = $3 ; $wgst = $5 ; } } else { next ; } if( $id eq "LAX" ) { # Handles city temperature appended at end of report if( s#/ ?(CITY\s*[\d/]{2,3})## ) { $comment = " $1" ; } } # Extract station's latitude, longitude, elevation, priority. ( $lat, $lon, $elev, $priority, $wmo_id ) = split( ' ', $STATIONS{ "$id" } ) ; if( $lat eq "" ) { # Station not found in directory #print STDERR "Couldn't find $id in station directory.\n" ; next ; } if( s/^AUTOB // ) { # for now skip AUTOB reports for SDB, DRT, and INW next ; } if( s/^AMOS // ) { # Stations such as SMP $amos = "TRUE" ; } if( s#^RAMOS /## ) { # Process RAMOS reports somewhat differently $ramos = "TRUE" ; } if( s/^A[O0]2A? // ) { # Process ASOS reports somewhat differently $asos = "TRUE" ; if( s/CLR BLO 120 // ) { $ceiling = "888" ; } s/^MM // ; } if( s/^AWOS // ) { # Process AWOS reports somewhat differently $awos = "TRUE" ; if( s/CLR BLO 120 // ) { # Sky cover is unknown for this case # $ceiling = ">120" ; $ceiling = "888" ; # Above value confusing to fortran io } if( s/^M // ) { # sky cover info missing $ceiling = "M" ; } if( s/SLP (\d\d\d)// ) { # OTH reports in this manner $pres = $1 ; } } if( s/^-X // ) { $dashx = "TRUE" ; $skyc = 0 ; } if( s/^W ?(\d{1,2}) ?X // ) { # Sky obscured $skyc = 9 ; $ceiling = $1 ; } elsif( s/^CLR // ) { # Clear $skyc = 0 ; $ceiling = 999 ; } else { # Capture each cloud layer while ( s/^[ME]?(\d{1,3})V? ?(-?)(SCT|BKN|[0O]VC) // ) { $thin = $2 ; if( ( $3 eq "BKN" || $3 eq "OVC" || $3 eq "0VC" ) && !$ceiling ) { if( !$thin ) { $ceiling = $1 ; } } $skyc = $cover{$3} ; $read_cloud = "TRUE" ; } if( !$ceiling && ( $read_cloud || $dashx ) ) { $ceiling = 999 ; } } #This section assumes sky info accompanied by vis and pres weather if( $ceiling ne "" ) { if( $ceiling eq "M" ) { $ceiling = "" ; } # Now decode visibility and present weather if( s#^((<?\d{1,2}/\d{1,2})|(\d{1,3}\+?)) ?([A-Z+-]*) ## ) { $vis = $1 ; $wea = $4 ; } if( s#^(\d)/(\d{1,2})## ) { # Check whether more visibility follows if( $2 > $1 ) { # Otherwise must be T and Td $vis .= $1 . "/" . $2 ; if( s#^([A-Z]+[A-Z+-]*) ## ) { $wea = $1 ; } else { s#^ ## ; # If no present weather then remove leading space } } else { # T and Td are both single digits $t = $1 ; $td= $2 ; if( s#^/E?(\d\d)(\d\d)(G(\d+))?/## ) { $wdir = $1 ; $wspd = $2 ; $wgst = $4 ; } } } } $wea =~ s/^V// ; # Remove reference to variable visibility from $wea if( $vis =~ m#^<1/4# ) { # AWOS stations report in this way $vis = "1/8" ; } # Use this code to change visibility to decimal notation if needed if( $vis =~ m#^(\d?)(\d)/(\d{1,2})# ) { # Fractional visibility if( $3 != 0 ) { $vis = $1 + $2/$3 ; } else { $vis = "" ; } } # Regular(SA or RS) obs on the hour, or amos/asos report if( $type ne "SP" || $amos || $asos || $awos ) { if( s#^E?(\w+)/ ?([\w-]+)/([\w-]+)/E?(\d\d)(\d\d)(G(\d+)| M)?/## ){ $pres = $1 ; $t = $2 ; $td = $3 ; $wdir = $4 ; $wspd = $5 ; $wgst = $7 ; } elsif( s#^ ?([\w-]+)/([\w-]+)/E?(\d\d)(\d\d)(G(\d+)| M)?/## ){ $t = $1 ; $td = $2 ; $wdir = $3 ; $wspd = $4 ; $wgst = $6 ; $td =~ s/M//g ; # Check for missing value } else { $skyc = $ceiling = $vis = $wea = "" ; } if( $pres =~ /[a-zA-Z]/ || length( $pres ) != 3 ) { $pres = "" ; } if( $t =~ /[a-zA-Z]/ ) { $t = "" ; } if( $td =~ /[a-zA-Z]/ ) { $td = "" ; } } else { # Special report(SP) if( s#^E?(\d\d)(\d\d)(G(\d+))?/## ) { $wdir = $1 ; $wspd = $2 ; $wgst = $4 ; } } if( $wdir ne "" ) { $wdir *= 10 ; if( $wdir == 0 ) { $wdir = "00" ; } } if( $ramos && s#PK WND (\d{2,3})## ) { $wgst = $1 ; $wgst =~ s/^0(\d)$/$1/ ; } if( $amos && s/PK WND (\d{2,3}) \d\d\d// ) { unless ( $wgst ) { $wgst = $1 ; # $wgst =~ s/^0(\d\d)/$1/ ; } } if( $wspd ne "" ) { $wspd *= 1 ; } if( $wgst ne "" ) { $wgst *= 1 ; } if( $wspd ne "" ) { # If wind was found then search for altimeter setting if( s#^(\d\d\d|M)/?# # ) { # Altimeter setting $alt = $1 ; $alt =~ s#M##g ; } } if( $asos ) { if( s/ PCPN (\d\d\d\d|M)( |$)/ / ) { $pcp1 = $1 ; if( $pcp1 eq "0000" ) { $pcp1 = " T" ; } if( $pcp1 =~ /^\d+$/ ) { $pcp1 *= 1 ; # Remove leading zeroes if( $pcp1 < 10 ) { $pcp1 = "0" . $pcp1 ; } } } else { $pcp1 = " 0" ; } } if( s/ NOSPL// ) { # no specials(SP) between hours $comment .= $& ; } if( $hr == 7 && $min > 45 ) { if( s# 98(\d\d\d)([ /]|$)# # ) { $sunshine = $1/60. + .05 ; $sunshine =~ s/(\.\d)\d*/$1/ ; $comment = " sunshine=$sunshine hrs" . $comment ; } } if( $hr >= 4 && $hr <= 11 ) { # Midnight Local Standard Time if( s# 4(\d)(\d{3})(\d)(\d{3})([ /]|$)# # ) { $tmax = $1 ? -$2*1 : $2*1 ; $tmin = $3 ? -$4*1 : $4*1 ; $comment .= " Mx=$tmax Mn=$tmin" ; if( $id eq "RSN" ) { $comment = "Hanford:" . $comment ; } } } $hourly_3 = $hourly_6 = $hourly_12 = "" ; if( ($hr+1)%3 == 0 && $min>20 && $type ne "SP" ) { $hourly_3 = "TRUE" ; if( ( $hr+1 )% 6 == 0 ) { $hourly_6 = "TRUE" ; } if( ( $hr+1 )%12 == 0 ) { $hourly_12 = "TRUE" ; } } elsif( $hr%3 == 0 && $min<30 && $type ne "SP" ) { $hourly_3 = "TRUE" ; if( $hr% 6 == 0 ) { $hourly_6 = "TRUE" ; } if( $hr%12 == 0 ) { $hourly_12 = "TRUE" ; } } # Process only 3-hourly SA or RS reports in the next block if( $hourly_3 && !$ramos ) { if( $hourly_12 ) { # Process only 12-hourly SA/RS reports here if( s/(( [A-Z]{3})? RADAT \w+)// ){ $comment .= $1 ; } } if( $asos || ! $pre1995 ) { if( s# 5(\d)(\d\d\d)([ /]|$)# # ) { $ptend = $1 ; $deltap = $2 ; $deltap =~ s/0(\d\d)/$1/ ; $ptend_found = "TRUE" ; } if( s# 6(\d\d\d)/([ /]|$)# # ) { $pcp3_6 = $1 ; if( $pcp3_6 eq "000" ) { $pcp3_6 = "T" ; } $pcp3_6 =~ s/0(\d\d)/$1/ ; } elsif( s# 6////( |$)# # ) { $pcp3_6 = "" ; } elsif( $ptend_found ) { $pcp3_6 = "0" ; } if( $hr == 11 ) { # 12 GMT only if( s# 7(\d{4})([ /]|$)# # ) { $pcp24 = $1 ; $pcp24 *= 1 ; if( $pcp24 < 10 ) { $pcp24 = "0" . $pcp24 ; } } elsif( s# 7////([ /]|$)# # ) { $pcp24 = "" ; } elsif( $ptend_found ) { $pcp24 = "0" ; } } if( s# 1(\d)(\d\d\d)([ /]|$)# # ) { $tmax = $1 ? -$2*1 : $2*1 ; } else { s# 1////([ /]|$)# # ; } if( s# 2(\d)(\d\d\d)([ /]|$)# # ) { $tmin = $1 ? -$2*1 : $2*1 ; } else { s# 2////([ /]|$)# # ; } if( $hr <= 6 || $hr == 23 ) { # 00 and 06 GMT $xt = $tmax ; } else { $xt = $tmin ; } # 12 and 18 GMT if( s# 8/([\d/]{3})([ /]|$)# # ) { $comment .= " C$1" ; } # if( s/ 901(\d\d)( |$)/ / ) { # New snowfall in inches # $snowfall = $1 ; # } if( s# 933(\d\d\d)([ /]|$)# # ) { # Water equivalent snow depth in $snowh2o = $1/10. ; # tenths of inch } if( $snowh2o ) { $snowh2o += .05 ; $snowh2o =~ s/(\.\d)\d*/$1/ ; } if( s# 4/(\d\d\d)([ /]|$)# # ) { # Snow depth in inches $snow = $1 ; $snow =~ s#^0+## ; } } # end of ASOS processing else { # non ASOS stations if( s/ 901(\d\d)( |$)/ / ) { # New snowfall in inches $snowfall = $1 ; } if( s/ 902(\d\d)( |$)/ / ) { # Water equivalent snow depth in $snowh2o = $1/10. ; # tenths of inch } if( s/ 903(\d\d)( |$)/ / ) { # Water equivalent snow depth in $snowh2o += $1 ; # whole inches } if( $snowh2o ) { $snowh2o += .05 ; $snowh2o =~ s/(\.\d)\d*/$1/ ; } while ( s/ 904(\d\d)( |$)/ / ) { # Snow depth in inches if( $1 == 99 ) { $snow = $snow + 100 ; } else { $snow = $snow + $1 ; } } # probably Max/Min temp and 24 hr precipitation if( s/ 4(\d\d)(\d\d)( 2(\d\d\d\d))?( |$)/ / ) { if( $1 eq "00" ) { # found ptend/precip group instead $ptend = "4" ; $deltap = $1 ; $pcp3_6 = $2 ; $ptend_found = 1 ; } else { # found Max and Min temperature $tmax = $1 ; $tmin = $2 ; if( $pcp24 = $4 ) { $pcp24 *= 1 ; # Remove leading zeroes ; if( $pcp24 < 10 ) { $pcp24 = "0" . $pcp24 ; } } } } if( s# [A-Z]{1,2}R[\d/]{2}[ \w]*$## ) { # Runway condition $comment .= $& ; } # s#[\s/]+$## ; # Remove trailing slashes such as found on OTH report if( $hourly_12 ) { if( s/ 2(\d\d\d\d)\s*$// ) { # 24 hr precipitation $pcp24 = $1 ; $pcp24 *= 1 ; # Remove leading zeroes ; if( $pcp24 < 10 ) { $pcp24 = "0" . $pcp24 ; } } } if( s# 1\d[\d/][\d/]( |$)# # ) { # Cloud types $comment = $& . " " . $comment ; } if( s/ (\d{1,2})\s*$/ / ) { $xt = $1 ; } if( s/ 99(\d\d\d)\s*$/ / ) { # Pressure change exceeds 9.9 mb $deltap = $1 ; } if( s/ ONE\s*$/ / ) { $one_inch = "TRUE" ; } elsif( s/ TWO\s*$/ / ) { $two_inch = "TRUE" ; } elsif( s/ THREE\s*$/ / ) { $three_inch = "TRUE" ; } if( !$ptend_found && s#[ /](\d)(\d\d)(\d\d)?\s*$# # ) { $ptend = $1 ; if( !$deltap ) { $deltap = $2 ; } $pcp3_6 = $3 ; if( $one_inch ) { $pcp3_6 += 100 ; } elsif( $two_inch ) { $pcp3_6 += 200 ; } elsif( $three_inch ) { $pcp3_6 += 300 ; } if( !$pcp3_6 ) { $pcp3_6 = "0" ; } # Military stations do not report precip at 03, 09, 15, and 21GMT. if( !$hourly_6 ) { if( $id eq "GRF"||$id eq "TCM"||$id eq "NUW"||$id eq "SKA" ) { $pcp3_6 = "" ; } } } if( $pcp3_6 eq "00" ) { $pcp3_6 = "-1" ; } # Trace precip coded as -1 } } # end of 3-hourly processing # Clean up in preparation for adding to comment field s#^[/ ]*## ; s#[/ ]*$## ; s# / # #g ; s#\s+# # ; s# #_#g ; s#,#;#g ; # Substitute ; for , and underscore for spaces $comment = $_ . $comment ; if( $snowh2o ) { $comment = "snowH2O=$snowh2o " . $comment ; } $comment = $correction . $comment ; $comment =~ s#^\s+## ; $comment = $pcp1 . " " . $comment ; # if( $asos ) { # $pcp1str = sprintf ( "%3.3s ", $pcp1 ) ; # $comment = $pcp1str . $comment ; # } # Needed for using with list directed fortran io #$id = "\"" . $id . "\"" ; $t =~ s/(-?)(0+)([1-9]+)/$1$3/ ; $td =~ s/(-?)(0+)([1-9]+)/$1$3/ ; # expand abreviations and partial numbers if( $alt && $alt < 500 ) { $alt = "3" . "$alt" ; $alt /= 100 ; } elsif( $alt && $alt > 500 ) { $alt = "2" . "$alt" ; $alt /= 100 ; } if( $pres && $pres < 600 ) { $pres = "10" . "$pres" ; $pres /= 10 ; } elsif( $pres && $pres > 600 ) { $pres = "9" . "$pres" ; $pres /= 10 ; } if( 0 ) { $report_dec = join(',', $id, $type, $priority, $hr, $min, $lat, $lon, $elev, $ceiling, $skyc, $vis, $wea, $pres, $t, $td, $wdir, $wspd, $wgst, $alt, $ptend, $deltap, $pcp3_6, $xt, $pcp24, $snow, $tmax, $tmin, $comment ) ; print "\n---$hold_report---\n" ; print OUT $report_dec, "\n" ; } # set defaults for NetCDF $hr = $F unless $hr ; $t = $F unless $t ; $td = $F unless $td ; $pres = $F unless $pres ; $wdir = $F unless $wdir ; $wspd = $F unless $wspd ; $wgst = $F unless $wgst ; $alt = $F unless $alt ; $vis = $F unless $vis ; $wea = $F unless $wea ; $ptend = $F unless $ptend ; $deltap = $F unless $deltap ; $pcp1 = $F unless $pcp1 ; $pcp3 = $F unless $pcp3 ; $pcp6 = $F unless $pcp6 ; $pcp24 = $F unless $pcp24 ; $tmax = $F unless $tmax ; $tmin = $F unless $tmin ; # output the NetCDF data here $datap[ 0 ] = \$wmo_id ; #&charord( \@id, $id, 4 ) ; &padstr( \$id, 4 ) ; $datap[ 1 ] = \$id ; $datap[ 2 ] = \$lat ; $datap[ 3 ] = \$lon ; $datap[ 4 ] = \$elev ; $datap[ 5 ] = \$hr ; $datap[ 6 ] = \$hr ; $datap[ 7 ] = \$t ; $datap[ 8 ] = \$td ; $datap[ 9 ] = \$pres ; $datap[ 10 ] = \$wdir ; $datap[ 11 ] = \$wspd ; $datap[ 12 ] = \$wgst ; $datap[ 13 ] = \$alt ; $datap[ 14 ] = \$vis ; #print "$wea\n" ; @wea = ( $wea, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) ; $datap[ 15 ] = \@wea ; &padstr( \$stn_type, 1 ) ; $datap[ 16 ] = \$stn_type ; &padstr( \$type, 2 ) ; $datap[ 17 ] = \$type ; $datap[ 18 ] = \$ptend ; $datap[ 19 ] = \$deltap ; $datap[ 20 ] = \$pcp1 ; $datap[ 21 ] = \$pcp3 ; $datap[ 22 ] = \$pcp6 ; $datap[ 23 ] = \$pcp24 ; $datap[ 24 ] = \$tmax ; $datap[ 25 ] = \$tmin ; &padarr( \@cc, 5, 8 ) ; $datap[ 26 ] = \@cc ; $datap[ 27 ] = \[ 0, 0, 0, 0, 0 ] ; &padarr( \@cloudtype, 5, 1 ) ; $datap[ 28 ] = \@cloudtype ; #&padstr( \$comment, 256 ) ; #$datap[ 29 ] = \$comment ; &padstr( \$raw, 256 ) ; $datap[ 29 ] = \$raw ; $result = NetCDF::recput( $ncid, $recnum, [ @datap ] ) ; #$result = NetCDF::recput( $ncid, $recnum, [ \$wmo_id ] ) ; #print STDOUT "NetCDF::recput result = $result\n" ; $recnum++ ; #last ; } # end of for ( @reports ) loop &cleanup() if( eof( STDIN ) ) ; } # end while( 1 ) &cleanup(); exit( 0 ) ; #should never get here sub cleanup { local( $sig ) = @_ ; #print "Caught a SIG$sig --shutting down\n" if( $sig ) ; $result = NetCDF::close( $ncid ) ; #print STDOUT "NetCDF::close result = $result\n" ; #close OUT ; exit( 0 ) ; } # pad str to correct length sub padstr { ( $str, $len ) = @_ ; local( $size, $i ) ; $size = length( $$str ) ; for( $i = $size; $i < $len; $i++ ) { $$str .= "\0" ; #print "$$str,\n" ; } } # pad arr to correct length sub padarr { ( $arr, $x, $y ) = @_ ; local( $size, $i, $j ) ; for( $i = 0; $i < $x; $i++ ) { $size = length( $$arr[ $i ] ) ; for( $j = $size; $j < $y; $j++ ) { $$arr[ $i ] .= "\0" ; #print STDOUT ",$$arr[ $i ],\n" ; } } }
decoders
archives: