0

I have a list of strings that I want to save into a netCDF using MATLAB. However, I'm having trouble creating the file.

method_ID is a char array like this:

'55-059-0019-88101-1'
'55-059-0019-88101-1'
'55-059-0019-88101-1'
'55-059-0019-88101-1'
'55-059-0019-88101-1'
'55-059-0019-88101-1'
'55-059-0019-88101-1'
'55-059-0019-88101-1'
'55-059-0019-88101-1'
'55-059-0019-88101-1'

I tried to do the following, but it saves the strings out as one long string instead of 10 strings.

filename = ['PM25_24hr_',num2str(years(y)),'_EPA_AQS.nc'];
ncfilename = ['/data3/jg3223/PM25/netCDF/',filename]; 

method_ID = char(data_PM25{:,1});

% Create the file, overwriting if already exists (Clobber) and
% 64-bit offset (Allow easier creation of files and variables which are larger
% than two gigabytes.)
mode = bitor(netcdf.getConstant('CLOBBER'),netcdf.getConstant('64BIT_OFFSET'));
ncid = netcdf.create(ncfilename,mode);

% Define (file) global attributes
globalVarId=netcdf.getConstant('GLOBAL');
netcdf.putAtt(ncid,globalVarId,'name','PM25_24hr_AQS');

[a,b] = size(method_ID);
IDDimId = netcdf.defDim(ncid,'method_ID',a*b); % I know this size is wrong, but using `length(method_ID)` runs a size error later on

% Define variables, starting with coordinate variables,
% with appropriate names, types, and dimensions
IDVarId = netcdf.defVar(ncid,'method_ID','char',IDDimId);

% Exit the "define mode", i.e., structure creation mode
netcdf.endDef(ncid);

method ID
netcdf.putVar(ncid,IDVarId,method_ID);

% Close the netCDF file
netcdf.close(ncid);

1 Answer 1

2

You should define two dimensions, if you are using "classic strings".

Strings can be stored using netCDF in two flavors, "classic strings" and "arrays of strings" (https://www.unidata.ucar.edu/software/netcdf/netcdf-4/newdocs/netcdf-c/Strings.html). "Classic strings" do not require netCDF version 4.0+ and following answer is based on this.

%% Solution using classic string (without NETCDF-4)

ncfilename ='./AQS.nc';
uint_method=uint8('55-059-0019-88101-1');
method_ID = char(repmat(uint_method,10,1));
[a,b] = size(method_ID);  %a=10, b=19

mode = bitor(netcdf.getConstant('CLOBBER'),netcdf.getConstant('64BIT_OFFSET'));
ncid = netcdf.create(ncfilename,mode);

globalVarId=netcdf.getConstant('GLOBAL');
netcdf.putAtt(ncid,globalVarId,'name','PM25_24hr_AQS');

%IDDimId = netcdf.defDim(ncid,'method_ID',a*b);
% IDDimId = netcdf.defDim(ncid,'method_ID',length(method_ID)); % ERROR: input elements does not match the variable size
% IDVarId = netcdf.defVar(ncid,'method_ID','char',IDDimId);

IDDim1 = netcdf.defDim(ncid,'charlen',b);
IDDim2 = netcdf.defDim(ncid,'methods',a);
IDVarId = netcdf.defVar(ncid,'method_ID','char',[IDDim1 IDDim2]);

netcdf.endDef(ncid);
netcdf.putVar(ncid,IDVarId,method_ID'); %transpose
netcdf.close(ncid);

You will get:

$ ncdump AQS.nc 
netcdf AQS {
dimensions:
    charlen = 19 ;
    methods = 10 ;
variables:
    char method_ID(methods, charlen) ;

// global attributes:
        :name = "PM25_24hr_AQS" ;
data:

 method_ID =
  "55-059-0019-88101-1",
  "55-059-0019-88101-1",
  "55-059-0019-88101-1",
  "55-059-0019-88101-1",
  "55-059-0019-88101-1",
  "55-059-0019-88101-1",
  "55-059-0019-88101-1",
  "55-059-0019-88101-1",
  "55-059-0019-88101-1",
  "55-059-0019-88101-1" ;
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.