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.

Re: Fixed problem

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/
==============================================================================


  • 1999 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the decoders archives: