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: