diff toolboxes/FullBNT-1.0.7/KPMtools/loadcell.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/FullBNT-1.0.7/KPMtools/loadcell.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,153 @@
+function [lc,dflag,dattype]=loadcell(fname,delim,exclusions,options);
+%function [lc,dflag,numdata]=loadcell(fname,delim,exclusions);
+%  
+%  loadcell loads a cell array with character delimited
+%  data, which can have variable length lines and content.
+%  Numeric values are converted from string to double 
+%  unless options is a string containing 'string'.
+%  
+%  loadcell is for use with small datasets. It is not optimised
+%  for large datasets.
+% 
+%  fname is the filename to be loaded
+%
+%  delim is/are the relevant delimiter(s). If char(10) is included
+%  newlines are simply treated as delimiters and a 1-d array is created.
+%
+%  exclusions  are the set of characters to be treated as paired
+%    braces: line ends or delimiters within braces are ignored.
+%    braces are single characters and any brace can pair with 
+%    any other brace: no type pair checking is done.
+%
+%  options can be omitted or can contain 'string' if no numeric
+%    conversion is required, 'single' if multiple adjacent seperators
+%    should not be treated as one, 'free' if all linefeeds should be stripped
+%    first and 'empty2num' if empty fields are to be treated as numeric 
+%    zeros rather than an empty character set. Combine options using 
+%    concatenation.
+%
+%  lc is a cell array containing the loaded data.
+%
+%  dflag is a set of flags denoting the (i,j) values where data was entered
+%  dflag(i,j)=1 implies lc(i,j) was loaded from the data, and not just set
+%  to empty, say, by default.
+%
+%  numdata is an array  numdata(i,j)=NaN implies
+%    lc(i,j) is a string, otherwise it stores the number at i,j.
+%    This will occur regardless of whether the 'string' option is set.
+%
+%  lc will return -1 if the file is not found or could not be
+%  opened.
+%
+%  Hint: numdata+(1/dflag-1) provides a concise descriptor for the numeric data
+%  Inf=not loaded
+%  NaN=was string or empty set.
+%  otherwise numeric
+%
+%  EXAMPLE
+%
+%[a,b]=loadcell('resultsfile',[',' char(9)],'"','single-string');
+%   will load file 'resultsfile' into variable a, treating any of tab or 
+%   comma as delimiters. Delimiters or carriage returns lying 
+%   between two double inverted commas will be ignored. Two adjacent delimiters
+%   will count twice, and all data will be kept as a string.
+%
+%   Note: in space-separated data 'single' would generally be omitted,
+%   wheras in comma-seperated data it would be included.
+%  
+%   Note the exclusion characters will remain in the final data, and any data
+%   contained within or containing exclusion characters will not be 
+%   converted to numerics.
+%
+%   (c) Amos Storkey 2002
+%    v b160702
+
+% MATLAB is incapable of loading variable length lines or variable type values
+% with a whole file command under the standard library sets. This mfile 
+% fills that gap.
+if (nargin<4) 
+    options=' ';
+end;
+dflag = [];
+%Open file
+fid=fopen(fname,'rt');
+%Cannot open: return -1
+if (fid<0)
+  lc=-1;
+else
+  fullfile=fread(fid,'uchar=>char')';
+  %Strip LF if free is set
+  if ~isempty(findstr(options,'free'))
+      fullfile=strrep(fullfile,char(10),'');
+  end;
+  %Find all delimiters
+  delimpos=[];
+  for s=1:length(delim)
+    delimpos=[delimpos find(fullfile==delim(s))];
+  end
+  %Find all eol
+  endpos=find(fullfile==char(10));
+  endpos=setdiff(endpos,delimpos);
+  %find all exclusions
+  xclpos=[];
+  for s=1:length(exclusions);
+    xclpos=[xclpos find(fullfile==exclusions(s))];
+  end
+  sort(xclpos);
+  xclpos=[xclpos(1:2:end-1);xclpos(2:2:end)];
+  %Combine eol and delimiters
+  jointpos=union(delimpos,endpos);
+  t=1;
+  %Remove delim/eol within exclusion pairs
+  removedelim=[];
+  for s=1:length(jointpos)
+    if any((jointpos(s)>xclpos(1,:)) & (jointpos(s)<xclpos(2,:)))
+      removedelim(t)=jointpos(s);
+      t=t+1;
+    end;
+
+  end
+  %and add start point
+  jointpos=[0 setdiff(jointpos,removedelim)];
+  i=1;
+  j=1;
+  posind=1;
+  multflag=isempty(findstr(options,'single'));
+  stringflag=~isempty(findstr(options,'string'));
+  emptnum=~isempty(findstr(options,'empty2num'));
+  %Run through
+  while (posind<(length(jointpos)))
+    %Get current field
+    tempstr=fullfile(jointpos(posind)+1:jointpos(posind+1)-1);
+    %If empty only continue if adjacent delim count.
+    if ~(isempty(tempstr) & multflag);
+      %This ij is set
+      dflag(i,j)=1;
+      %Convert to num
+      tempno=str2double([tempstr]);
+      %If emptystring convert to zero if emptnum set
+      if (isempty(tempstr) & emptnum)
+          tempno=0;
+      end;
+      %Set dattype to no (or NaN if not a num
+      dattype(i,j)=tempno;
+      %If NaN set lc to string else to num if stringflag not set
+      if (isnan(tempno) |  stringflag) 
+        lc{i,j}=tempstr;
+      else
+        lc{i,j}=tempno;
+      end;
+      %Next j
+      j=j+1;
+    end;
+    %If eol inc i and reset j
+    if ismember(jointpos(posind+1),endpos)
+        i=i+1;
+        j=1;
+    end;
+    %Inc to next delim
+    posind=posind+1;      
+  end;
+end;
+%Logicalise dflag
+dflag=logical(dflag);