-
jacques.grelet_ird.fr authoredjacques.grelet_ird.fr authored
tsg_nc.m 3.37 KiB
function ncv = tsg_nc( 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$
% 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
% -------------
% read 2 first lines
header = textscan(fid,'%s',2,'delimiter','\n','headerlines', 3 );
% extract each members from first header line
members = textscan(header{1}{1},'%s','delimiter',';');
% extract data type from second header line
types = textscan(header{1}{2},'%s','delimiter',';');
% read end of file
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});
% check nvc.size (number of line) is an integer
% ---------------------------------------------
if mod(numel(values{1}),numel(members{1}))
warning(['Incorrect number parameters in file: ' file]);
end
% loop
% ----
for i=1:ncv.size
% may be give type to key ?
line = str2double(values{1}{1 + ncv.member * (i -1)});
key = values{1}{2 + ncv.member * (i -1)};
for j=3:ncv.member
member = genvarname(members{1}{j});
type = genvarname(types{1}{j});
value = values{1}{j + 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
% check if i (number of line) should be equal to line
% -------------------------------------------------------
if line ~= i
error(['line number mismatch in ' file ', line: ' int2str(i-1) ...
'... Check your file']);
end
% populate the hashtable
% ----------------------
data = put(data, key, theStruct);
% initialize internal structure for next loop
% -------------------------------------------
theStruct = [];
end
% remove line and first member (key)in structure
% ----------------------------------------------
ncv.member = ncv.member-2;
% bless tsg_nc class and inherite from hashtable data
% ---------------------------------------------------
ncv = class(ncv, 'tsg_nc', data );
% close file
% ----------
fclose(fid);