function struc=read_dat(fname)
% READ_DAT(fname) reads a space delimited numeric file with one header line.
%
% If "fname" is omitted the function will prompt for the input file.
%
% Read in a whitespace delimited ASCII numeric file with a one line
% header of variable names. The file must have a variable name for each
% column of numbers. This script will create a structure of numeric
% column vectors with each column using the corresponding name from the
% header line.
%
% Many programs will create these files such as Excel (.txt or .prn)
% and PSI-Plot.
%
% Example input file:
%
% rt.dat:
% t x v
% 0.00000000000E+00 3.96999999999E-02 0.00000000000E+00
% 5.00258517937E-04 3.99697150269E-02 -7.44753444412E+00
% 1.00272303185E-03 3.98886295490E-02 -5.93834113393E-01
% 2.00322475159E-03 3.99375098253E-02 1.31980134594E-05
%
% Example usage and output:
%
% s=read_dat('rt.dat');
% plot(s.t,s.x, s.t,s.v)
%
% or
%
% s=read_dat
% David Edwards <david@btdt.org> Sat Apr 9 15:28:43 PDT 2005
% Mon May 2 23:01:25 PDT 2005 (line 50: Print the selected file name)
if (nargin == 0)
[fname,ppath] = uigetfile( ...
{'*.csv;*.txt;*.prn;*.dat', 'ASCII Files (*.csv, *.txt, *.prn, *.dat)'; ...
'*.csv','Comma Separated Vectors (*.csv)'; ...
'*.txt','Excel Text (tab delimited) (*.txt)'; ...
'*.prn','Excel Formatted Text (space delimited) (*.prn)'; ...
'*.dat','PSI Plot Text (*.dat)'; ...
'*.*', 'All Files (*.*)'}, ...
'Select an ASCII whitespace delimited numeric file');
if (fname == 0)
error('No file selected.');
else
fname=[ppath,fname];
['Selected file: ' fname]
end
end
fid=fopen(fname, 'r');
% Read in the header line of variable names
var_names = fgetl(fid);
fclose(fid);
var_names = deblank(var_names); % Remove trailing whitespace
var_names = regexprep(var_names,'^\s+',''); % Remove leading whitespace
% Load the string of variable names into a cell array
var_names=regexprep(var_names, '[,\s]+', ''','''); % t x-> t','x
var_names=['var_names={''', var_names, '''};'];
eval(var_names);
% Read the rest of the file into a matrix and convert to a cell array and
% then into a structure using var_names.
if (regexp(fname,'\.csv$'))
mat = dlmread(fname,',', 1, 0);
else
% Due to changes in dlmread betweeb MATLAB version 6 and 7...
major_ver=version;
major_ver=major_ver(1);
if (eval(major_ver) < 7)
mat = dlmread(fname,' ', 1, 0);
else
mat = dlmread(fname,'', 1, 0);
end
end
[n,m]=size(mat);
% dlmread adds a column of zeros if there is extra white space after the
% last column of numbers. Therefore, only get Nvar columns.
Nvar = size(var_names,2);
if (m > Nvar)
mat = mat(:,[1:Nvar]);
end
c=mat2cell(mat,n,ones(1,Nvar));
struc=cell2struct(c,var_names,2);