annotate scripts/io/importdata.m @ 15546:3bf1e0da76b0

importdata: new function
author Erik Kjellson <erikiiofph7@users.sourceforge.net>
date Fri, 19 Oct 2012 13:56:22 -0400
parents
children 9a455cf96dbe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15546
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
1 ## Copyright (C) 2012 Erik Kjellson <erikiiofph7@users.sourceforge.net>
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
2 ##
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
3 ## This program is free software; you can redistribute it and/or modify
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
4 ## it under the terms of the GNU General Public License as published by
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
5 ## the Free Software Foundation; either version 3 of the License, or
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
6 ## (at your option) any later version.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
7 ##
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
8 ## This program is distributed in the hope that it will be useful,
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
9 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
10 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
11 ## GNU General Public License for more details.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
12 ##
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
13 ## You should have received a copy of the GNU General Public License
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
14 ## along with this program; if not, see <http://www.gnu.org/licenses/>.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
15
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
16 ## -*- texinfo -*-
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
17 ## @deftypefn {Function File} {@var{A} =} importdata (@var{fileName})
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
18 ## @deftypefnx {Function File} {@var{A} =} importdata (@var{fileName}, @var{delimiter})
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
19 ## @deftypefnx {Function File} {@var{A} =} importdata (@var{fileName}, @var{delimiter}, @var{headerRows})
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
20 ## @deftypefnx {Function File} {[@var{A}, @var{delimiter}] =} importdata (...)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
21 ## @deftypefnx {Function File} {[@var{A}, @var{delimiter}, @var{headerRows}] =} importdata (...)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
22 ## Importing data from file.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
23 ##
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
24 ## Importing the contents of file @var{fileName} into workspace.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
25 ##
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
26 ## Input parameters:
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
27 ## @table @input
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
28 ## @item @var{fileName}
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
29 ## The file name for the file to import.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
30 ##
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
31 ## @item @var{delimiter}
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
32 ## The character separating columns of data. Use @code{\t} for tab. (Only valid for ascii files)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
33 ##
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
34 ## @item @var{headerRows}
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
35 ## Number of header rows before the data begins. (Only valid for ascii files)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
36 ## @end table
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
37 ##
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
38 ## Different file types are supported:
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
39 ## @itemize
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
40 ## @item Ascii table
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
41 ##
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
42 ## Importing ascii table using the specified number of header rows and the specified delimiter.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
43 ##
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
44 ## @item Image file
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
45 ##
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
46 ## @item Matlab file
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
47 ##
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
48 ## @item Wav file
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
49 ##
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
50 ## @end table
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
51 ##
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
52 ## @seealso{textscan, dlmread, csvread, load}
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
53 ## @end deftypefn
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
54
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
55 ## Author: Erik Kjellson <erikiiofph7@users.sourceforge.net>
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
56 ## 2012-10-16 First version
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
57
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
58
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
59 function [output, delimiter, headerRows] = importdata(varargin)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
60
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
61 # Default values
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
62 fileName = '';
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
63 delimiter = '';
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
64 headerRows = -1;
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
65
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
66 ##########
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
67
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
68 # Check input arguments
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
69
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
70 if (nargin < 1)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
71 print_usage ();
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
72 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
73
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
74 fileName = varargin{1};
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
75 # Check that the file name really is a string
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
76 if not(ischar(fileName))
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
77 error('importdata: File name needs to be a string.')
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
78 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
79 if strcmpi(fileName, '-pastespecial')
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
80 error('importdata: Option ''-pastespecial'' not implemented.')
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
81 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
82
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
83 if (nargin > 1)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
84 delimiter = varargin{2};
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
85 # Check that the delimiter really is a string
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
86 if not(ischar(delimiter))
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
87 error('importdata: Delimiter needs to be a character.')
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
88 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
89 if ((length(delimiter) > 1) && not(strcmpi(delimiter, '\t')))
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
90 error('importdata: Delimiter cannot be longer than 1 character.')
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
91 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
92 if strcmpi(delimiter, '\')
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
93 delimiter = '\\';
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
94 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
95 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
96
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
97 if (nargin > 2)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
98 headerRows = varargin{3};
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
99 if ((~isnumeric(headerRows)) || (headerRows < 0))
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
100 error('importdata: Number of header rows needs to be an integer number >= 0.')
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
101 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
102 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
103
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
104 if (nargin > 3)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
105 error('importdata: Too many input arguments.')
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
106 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
107
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
108 ##########
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
109
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
110 # Check file format
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
111 # Get the extension from the file name.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
112 [d n fileExt v] = fileparts(fileName);
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
113 # Make sure file extension is in lower case.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
114 fileExt = lower(fileExt);
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
115
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
116 switch fileExt
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
117 case {'.au','.snd'}
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
118 error(['importdata: Not implemented for file format ''' fileExt '''.'])
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
119 case '.avi'
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
120 error(['importdata: Not implemented for file format ''' fileExt '''.'])
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
121 case {'.bmp', '.cur', '.gif', '.hdf', '.ico', '.jpe', '.jpeg', '.jpg', '.pbm', '.pcx', '.pgm', '.png', '.pnm', '.ppm', '.ras', '.tif', '.tiff', '.xwd'}
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
122 delimiter = NaN;
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
123 headerRows = 0;
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
124 [output.cdata, output.colormap, output.alpha] = imread(fileName);
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
125 case '.mat'
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
126 delimiter = NaN;
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
127 headerRows = 0;
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
128 output = load(fileName);
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
129 case '.wk1'
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
130 error(['importdata: Not implemented for file format ''' fileExt '''.'])
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
131 case {'.xls', '.xlsx'}
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
132 #FIXME: implement Excel import.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
133 error(['importdata: Not implemented for file format ''' fileExt '''.'])
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
134 case {'.wav', '.wave'}
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
135 delimiter = NaN;
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
136 headerRows = 0;
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
137 [output.data, output.fs] = wavread(fileName);
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
138 otherwise
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
139 # Assume the file is in ascii format.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
140 [output, delimiter, headerRows] = importdata_ascii(fileName, delimiter, headerRows);
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
141 endswitch
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
142
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
143 # If there are any empty fields in the output structure, then remove them
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
144 if (isstruct(output) && (length(output) == 1))
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
145 fields = fieldnames(output);
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
146 for i=1:length(fields)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
147 if isempty(getfield(output, fields{i}))
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
148 output = rmfield(output, fields{i});
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
149 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
150 endfor
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
151
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
152 # If only one field is left, replace the structure with the field, i.e. output = output.onlyFieldLeft
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
153 # Update the list of fields
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
154 fields = fieldnames(output);
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
155 if (length(fields) == 1)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
156 output = getfield(output, fields{1});
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
157 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
158 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
159 endfunction
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
160
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
161
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
162 ########################################
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
163
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
164 function [output, delimiter, headerRows] = importdata_ascii(fileName, delimiter, headerRows)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
165
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
166 # Define the fields in the output structure so that the order will be correct.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
167 output.data = [];
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
168 output.textdata = [];
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
169 output.rowheaders = [];
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
170 output.colheaders = [];
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
171
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
172 # Read file into string and count the number of header rows
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
173
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
174 fileContent = fileread(fileName);
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
175 # The characters need to be in a row vector instead of a column vector to be recognized as a proper string.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
176 if (size(fileContent,2) == 1)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
177 fileContent = fileContent';
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
178 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
179
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
180 # Split the file into rows (using \r\n or \n as delimiters between rows).
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
181 fileContentRows = regexp(fileContent, '\r?\n', 'split');
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
182
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
183 #FIXME: guess delimiter, if it isn't defined
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
184 if (isempty(delimiter))
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
185 error('importdata: Guessing delimiter is not implemented yet, you have to specify it.')
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
186 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
187
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
188 #FIXME: A more intelligent way to count number of header rows. This is needed e.g. when delimiter=' ' and the header contains spaces...
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
189
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
190 # If number of header rows is undefined, then count the number of header rows by step through row by row and look for the delimiter.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
191 # Assume that the header can't contain any delimiter.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
192 if (headerRows < 0)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
193 headerRows = 0;
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
194 for i=1:length(fileContentRows)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
195 if (isempty(regexp(fileContentRows{i}, delimiter, 'once')))
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
196 headerRows++;
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
197 else
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
198 # Data part has begun and therefore no more header rows can be found
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
199 break;
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
200 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
201 endfor
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
202 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
203
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
204 # Put the header rows in output.textdata.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
205 if (headerRows > 0)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
206 output.textdata = fileContentRows(1:headerRows)';
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
207 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
208
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
209 # If space is the delimiter, then remove spaces in the beginning of each data row.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
210 if strcmpi(delimiter, ' ')
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
211 for i=(headerRows+1):length(fileContentRows)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
212 # strtrim does not only remove the leading spaces but also the tailing spaces, but that doesn't really matter.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
213 fileContentRows{i} = strtrim(fileContentRows{i});
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
214 endfor
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
215 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
216
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
217 # Remove empty data rows. Go through them backwards so that you wont get out of bounds.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
218 for i=length(fileContentRows):-1:(headerRows+1)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
219 if (length(fileContentRows{i}) < 1)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
220 fileContentRows = [fileContentRows(1:i-1), fileContentRows(i+1:length(fileContentRows))];
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
221 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
222 endfor
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
223
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
224 # Count the number of data columns.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
225 # If there are different number of columns, use the greatest value.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
226 dataColumns = 0;
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
227 delimiterPattern = delimiter;
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
228 # If space is the delimiter, then multiple spaces should count as ONE delimiter. Also ignore leading spaces.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
229 if (strcmpi(delimiter, ' '))
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
230 delimiterPattern = ' +';
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
231 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
232 for i=(headerRows+1):length(fileContentRows)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
233 dataColumns = max(dataColumns, length(regexp(fileContentRows{i}, delimiterPattern, 'split')));
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
234 endfor
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
235
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
236
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
237 # Go through the data and put it in either output.data or output.textdata depending on if it is numeric or not.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
238 output.data = NaN(length(fileContentRows)-headerRows, dataColumns);
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
239 for i=(headerRows+1):length(fileContentRows)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
240 # Only use the row if it contains anything other than white-space characters.
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
241 if (length(regexp(fileContentRows{i}, '\S','match')) > 0)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
242 rowData = regexp(fileContentRows{i}, delimiterPattern, 'split');
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
243 for j=1:length(rowData)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
244 # Try to convert the column to a number, if it works put it in output.data, otherwise in output.textdata
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
245 if (length(str2num(rowData{j})) > 0)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
246 output.data((i-headerRows),j) = str2num(rowData{j});
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
247 else
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
248 output.textdata{i,j} = rowData{j};
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
249 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
250 endfor
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
251 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
252 endfor
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
253
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
254 # Check wether rowheaders or colheaders should be used
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
255 if ((headerRows == dataColumns) && (size(output.textdata,2) == 1))
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
256 output.rowheaders = output.textdata;
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
257 elseif (size(output.textdata,2) == dataColumns)
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
258 output.colheaders = output.textdata(end,:);
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
259 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
260
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
261 # When delimiter = '\t' convert it to a tab, as is done in the Matlab version
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
262 if (strcmpi(delimiter, '\t'))
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
263 delimiter = sprintf('\t');
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
264 endif
3bf1e0da76b0 importdata: new function
Erik Kjellson <erikiiofph7@users.sourceforge.net>
parents:
diff changeset
265 endfunction