NOTE: The decoders
mailing list is no longer active. The list archives are made available for historical reasons.
#!/usr/local/bin/perl # Example program to encode variable length strings into a NetCDF file. # S. Diggs (sdiggs@xxxxxxxx) 1999.11.15 use diagnostics; #use strict; use NetCDF; unlink( "string_example.nc" ); # strings my @atmospheric_conditions = ( "cloudy", "sunny", "fog", "rain" ); my @count_ac = ($#atmospheric_conditions); print STDOUT "dimensions of array are @count_ac\n"; # my $ncid = NetCDF::create("string_example.nc", NetCDF::WRITE); #my $dimid = NetCDF::dimdef($ncid, 'recNum', NetCDF::UNLIMITED); $string_dimension = 80; my $sD = NetCDF::dimdef($ncid, 'string_dimension', $string_dimension); # NetCDF::attput($ncid, NetCDF::GLOBAL, "STRING_EXAMPLE", NetCDF::CHAR, "This is an example of string encoding"); my $varid_ac = NetCDF::vardef($ncid, 'ATM_COND', NetCDF::CHAR, $sD); ; # leaving define mode NetCDF::endef($ncid); #NetCDF::close($ncid); #exit(0); print STDERR "Leaving define mode....\n"; #put data into netcdf file my $i=0; my @start = (0); my @new_count = (80); $S80 = "\0" x $string_dimension ; foreach my $element (@atmospheric_conditions) { #@new_count = (length($element)); #print STDERR " Variable $i length = @new_count\n\t", # "starting at @start\n\n"; $element = padstr( $element, $string_dimension);NetCDF::varput($ncid, $varid_ac, \@start, \@new_count, \$element);
$i++; #bump the new starting point by adding the old ending point # to where we are now #@start = (($new_count[0] + $start[0])); last; } NetCDF::close($ncid); #done! # code to demonstrate UNLIMITED records $cdlfile = "sd.cdl" ; $ncfile = "sd.nc" ; $ncgen = "/upc/netcdf/bin/ncgen" ; system( "$ncgen -o $ncfile $cdlfile" ) ;$ncid = NetCDF::open( "$ncfile", WRITE ) ; $S80 = "\0" x $string_dimension ;
$ii = 0; foreach my $element (@atmospheric_conditions) { $element = padstr( $element, $string_dimension); @dataref = ( \$element ); #$results = NetCDF::recput($ncid, $ii, [@dataref]); $results = NetCDF::recput($ncid, $ii, [(\$element)]); print "$results\n" if( $results ); $ii++; } @dataref = ( \$S80 ); for( $record = 0; $record <= 3; $record++ ) { $results = NetCDF::recget( $ncid, $record, \@dataref ); print "$results\n" if( $results ); $ac = ${$dataref[ 0 ]} ; print "record = $record , $ac\n" ; } NetCDF::close($ncid);# 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 ; } netcdf string_example { dimensions: recNum = UNLIMITED ; // (0 currently) string_dimension = 80 ; variables: char ATM_COND(recNum, string_dimension) ; // global attributes: :STRING_EXAMPLE = "This is an example of string encoding" ; } ============================================================================== Robb Kambic Unidata Program Center Software Engineer III Univ. Corp for Atmospheric Research rkambic@xxxxxxxxxxxxxxxx WWW: http://www.unidata.ucar.edu/ ==============================================================================
decoders
archives: