Due to the current gap in continued funding from the U.S. National Science Foundation (NSF), the NSF Unidata Program Center has temporarily paused most operations. See NSF Unidata Pause in Most Operations for details.
NOTE: The decoders
mailing list is no longer active. The list archives are made available for historical reasons.
On Sun, 21 Nov 1999, Steve Diggs wrote:
Robb: OK, now I have another question. How the heck do I get the multi-dim CHAR variable back out? I can't find the proper syntax in the Perl interface to open the NetCDF file in your example to read in the CHAR data. Could you extend your last example to _specifically_ read in the CHAR array you write out? (as in close the file then reopen, get info, read CHAR array (all of it at once) into a Perl array, print array). I don't think that this would be so difficult. A user manual sure would help... thanks again, -sd
Steve, Here's an example of reading a NetCDF file using varget. Robb... #!/opt/bin/perl use NetCDF ; $ncfile = "demo.nc" ; $ncid = NetCDF::create($ncfile, NetCDF::CLOBBER ) ; $dimid = NetCDF::dimdef($ncid, 'recNum', NetCDF::UNLIMITED); $stadim = NetCDF::dimdef($ncid,"stations",10) ; $strlen = 10 ; $strdim = NetCDF::dimdef($ncid,"strlen", $strlen) ; $varid = NetCDF::vardef($ncid,"station",NetCDF::CHAR,[$dimid,$strdim]); NetCDF::endef($ncid) ; @names = ( "abcdef", "ABCDEF","A", "B", "C", "D", "E", "F", "G", "H" ) ; for ($i = 0 ; $i < 10 ; $i++ ) { $names[ $i ] = padstr( $names[ $i ], $strlen ) ; NetCDF::varput( $ncid, $varid, [$i,0], [1, $strlen], \$names[ $i ] ) ; #NetCDF::varput( $ncid, $varid, [$i,0], [1,10], "??????????" ) ; } NetCDF::close($ncid) ; # Example to reopen file and read the data $ncid = NetCDF::open( "$ncfile", WRITE ) ; $station_id = NetCDF::varid( $ncid, "station" ) ; print "station_id =$station_id\n\n" ; for ($i = 0 ; $i < 10 ; $i++ ) { @aStn = ($strlen x "\0" ) ; NetCDF::varget( $ncid, $station_id, [$i,0], [1, $strlen], \@aStn ) ; $newStation = ""; for ($j = 0; $j < $strlen; $j++) { $stnChr = chr($aStn[$j]); last if( $stnChr eq "\0" || $stnChr eq "\\" ) ; $newStation .= $stnChr ; } print "Station $i = $newStation\n" ; } NetCDF::close($ncid) ; exit( 0 ) ; # pad str to correct length sub padstr { ( $str, $len ) = @_ ; my( $size, $i ) ; $size = length( $str ) ; for( $i = $size; $i < $len; $i++ ) { $str .= "\0" ; #print "$str,\n" ; } if( $size > $len ) { print STDOUT "String length is over $len chars long:\n $str\n" ; $str = substr( $str, 0, $len ) ; #exit 0 ; } return $str ; } __END__ And this is what I get from ncdump: ncdump demo.nc netcdf demo { dimensions: recNum = UNLIMITED ; // (10 currently) stations = 10 ; strlen = 10 ; variables: char station(recNum, strlen) ; data: station "abcdef", "ABCDEF", "A", "B", "C", "D", "E", "F", "G", "H" ;} ==============================================================================
Robb Kambic Unidata Program Center Software Engineer III Univ. Corp for Atmospheric Research rkambic@xxxxxxxxxxxxxxxx WWW: http://www.unidata.ucar.edu/ ==============================================================================
decoders
archives: