Skip to content
Snippets Groups Projects
tsg_nc.m 2.66 KiB
Newer Older
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
function ncv = tsg_ncr( varargin )

% tsg_nc/tsg_nr -- Constructor for "tsg_nc" class.
% tsg_nc(varargin) constructs a 'tsg_nc' object from 
% supplied csv 'filename'.
%
% Usage:  nca = tsg_ncvar( file )
%
% Input
% -------
% filename ........... csv data filename
%
% Output
% --------
% ncv      ........... instance of tsg_ncvar object
%
% See also: methods('tsg_ncvar').
% 
% $Id: roscop.m 129 2007-03-16 08:56:31Z jgrelet $

% check varargin
% --------------
switch nargin
  case 0  % create default object
    error('csv filename not supplied');
  case 1
    if( isa(varargin{1}, 'char'))
      file = varargin{1};      
    else
      error('Wrong input argument');
    end
  otherwise
    error('Wrong number of input arguments');
end

% check csv file validity 
% -----------------------
fid = fopen( file, 'r' );
if fid == -1
  error(['The specified data file ''%s'' does not exist ...\n' ...
         'or is not in the directory which is on the MATLAB search path'],...
         file);   
end

% create hashtable
% ----------------
data = hashtable;

% read csv file
% -------------
header   = textscan(fid,'%s \n %s [^\n]','headerlines', 3 );
members  = textscan(header{1}{1},'%s','delimiter',';');
types    = textscan(header{2}{1},'%s','delimiter',';');
values   = textscan(fid,'%s','delimiter',';');

% populate private structure ncv
% ------------------------------
ncv.file    = which( file );
ncv.size    = numel(values{1}) / numel(members{1});
ncv.member  = numel(members{1}); 

% loop
% ----
for i=1:ncv.size
  for j=2:ncv.member
    member = genvarname(members{1}{j});
    type   = genvarname(types{1}{j});
    value  = values{1}{j + ncv.member * (i -1)};
    key    = values{1}{1 + ncv.member * (i -1)};
    
    % dynamically populate structure 'theStruct' 
    % ------------------------------------------
    if isempty(values{1}{j + ncv.member * (i -1)})
      theStruct.(member) = [];
    else
      switch type
        case 'char'
          theStruct.(member) = value;
        case {'integer','double'}
          theStruct.(member) = str2double(value);
        otherwise
          theStruct.(member) = value; 
      end
    end
  end
  
  % populate the hashtable
  % ----------------------
  data = put(data, key, theStruct);
  
  % initialize internal structure
  % -----------------------------
  theStruct = [];
  
end

% remove first member in structure, the key
% -----------------------------------------
ncv.member  = ncv.member -1;

% bless tsg_ncvar class and inherite from hashtable data
% ------------------------------------------------------
ncv = class(ncv, 'tsg_nc', data );