Newer
Older
% tsg_nc/tsg_nc -- Constructor for "tsg_nc" class.
% tsg_nc(varargin) constructs a 'tsg_nc' object from
% supplied csv 'filename'.
%
% Usage:
% nc = tsg_nc( file )
%
% Example:
% ncv = tsg_nc('tsg_ncvar.csv')
%
% Input
% -------
% filename ........... csv data filename
%
% Output
% --------
% 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
% -----------------------
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
% -------------

jacques.grelet_ird.fr
committed
hdr = textscan(fid,'%s',2,'delimiter','\n','headerlines', 3 );
% extract each members from first header line
% -------------------------------------------

jacques.grelet_ird.fr
committed
members = textscan(hdr{1}{1},'%s','delimiter',';');

jacques.grelet_ird.fr
committed
% extract variable and attribute type from second header line
% -----------------------------------------------------------

jacques.grelet_ird.fr
committed
types = textscan(hdr{1}{2},'%s','delimiter',';');
% generate one line format
% ------------------------
format = repmat('%s', 1, numel(members{1}));
% ----------------
values = textscan(fid, format, 'delimiter',';');

jacques.grelet_ird.fr
committed
% put header and members line to a hash, for next time when saving file
% ---------------------------------------------------------------------
header = hashtable;
for i=1:numel(members{1});
header = put(header, members{1}{i}, types{1}{i});
end
% populate private structure ncv
% ------------------------------
ncv.file = which( file );
ncv.size = numel(values{1});

jacques.grelet_ird.fr
committed
ncv.header = header;
ncv.members = numel(members{1});
% get id (first character indentifying begining & start of line (#)
% -----------------------------------------------------------------
id = values{1}{i};
endl = values{ncv.members}{i};
% check if line begin and end with '#' (we add the 5 header lines)
% ----------------------------------------------------------------_
if ~(strcmp(id, '#') & strcmp(endl, '#'))
error('tsgqc_GUI:tsg_nc', ...
'mismatch field number in %s, line: %d\nCheck your file : %s ...', ...
file, i+5, file);
end
% get key
% -------
key = values{2}{i};

jacques.grelet_ird.fr
committed
% loop over other members find in line and will give the
% right matlab type to each variable attribute
% ------------------------------------------------------
for j=3:ncv.members-1
member = genvarname(members{1}{j});
type = genvarname(types{1}{j});
value = values{j}{i};
% dynamically populate structure 'theStruct'
% ------------------------------------------
if isempty(value)
theStruct.(member) = [];
else
switch type

jacques.grelet_ird.fr
committed
theStruct.(member) = value;
% eval needed to construct matlab cell expression
% -----------------------------------------------

jacques.grelet_ird.fr
committed
case 'cell'
theStruct.(member) = eval(['{' value '}']);

jacques.grelet_ird.fr
committed
case 'byte'
theStruct.(member) = int8(str2num(value));
case 'integer'

jacques.grelet_ird.fr
committed
theStruct.(member) = int16(str2num(value));

jacques.grelet_ird.fr
committed
case 'float'
theStruct.(member) = single(str2double(value));
case 'double'

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% by default, display a warning
% -----------------------------
warning('tsgqc_GUI:tsg_nc', ...
'unknow type ''%s'' for ''%s'' attribute.\nCheck your %s file', ...
type, member, ncv.file);

jacques.grelet_ird.fr
committed
% and cast to char
% ----------------
% populate the hashtable
% ----------------------
data = put(data, key, theStruct);
% initialize internal structure for next loop
% -------------------------------------------
% remove id, first member (key) and endl in structure
% ---------------------------------------------------
ncv.members = ncv.members - 3;
% bless tsg_nc class and inherite from hashtable data
% ---------------------------------------------------
% close file
% ----------
fclose(fid);