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.

netcdf-perl examples

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


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