annotate scripts/io/textscan.m @ 11191:01ddaedd6ad5

Reverse changeset b1f4bdc276b6. Use all lower case for "uniformoutput" option.
author Rik <octave@nomad.inbox5.com>
date Thu, 04 Nov 2010 12:18:08 -0700
parents 224c80da37c5
children c776f063fefe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11141
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
1 ## Copyright (C) 2010 Ben Abbott <bpabbott@mac.com>
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
2 ##
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
3 ## This file is part of Octave.
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
4 ##
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
5 ## Octave is free software; you can redistribute it and/or modify it
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
6 ## under the terms of the GNU General Public License as published by
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
7 ## the Free Software Foundation; either version 3 of the License, or (at
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
8 ## your option) any later version.
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
9 ##
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
10 ## Octave is distributed in the hope that it will be useful, but
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
13 ## General Public License for more details.
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
14 ##
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
15 ## You should have received a copy of the GNU General Public License
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
16 ## along with Octave; see the file COPYING. If not, see
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
17 ## <http://www.gnu.org/licenses/>.
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
18
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
19 ## -*- texinfo -*-
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
20 ## @deftypefn {Function File} {@var{c} =} textscan (@var{fid}, @var{format})
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
21 ## @deftypefnx {Function File} {@var{c} =} textscan (@var{fid}, @var{format}, @
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
22 ## @var{n})
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
23 ## @deftypefnx {Function File} {@var{c} =} textscan (@var{fid}, @var{format}, @
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
24 ## @var{param}, @var{value}, @dots{})
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
25 ## @deftypefnx {Function File} {@var{c} =} textscan (@var{fid}, @var{format}, @
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
26 ## @var{n}, @var{param}, @var{value}, @dots{})
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
27 ## @deftypefnx {Function File} {@var{a} =} textscan (@var{str}, @dots{})
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
28 ## @deftypefnx {Function File} {[@var{a}, @var{position}] =} textscan (@dots{})
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
29 ## Read data from a text file.
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
30 ##
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
31 ## The file associated with @var{fid} is read and parsed according to @var{format}.
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
32 ## The function behaves like @code{strread} except it works by parsing a file
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
33 ## instead of a string. See the documentation of @code{strread} for details.
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
34 ## In addition to the options supported by @code{strread}, this function
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
35 ## supports one more:
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
36 ## @itemize
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
37 ## @item "headerlines":
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
38 ## @end itemize
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
39 ## The first @var{value} number of lines of @var{str} are skipped.
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
40 ##
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
41 ## The optional input, @var{n}, specifes the number of lines to be read from
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
42 ## the file, associated with @var{fid}.
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
43 ##
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
44 ## The output, @var{c}, is a cell array whose length is given by the number
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
45 ## of format specifiers.
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
46 ##
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
47 ## The second output, @var{position}, provides the position, in characters,
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
48 ## from the beginning of the file.
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
49 ##
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
50 ## @seealso{dlmread, fscanf, load, strread, textread}
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
51 ## @end deftypefn
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
52
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
53 function [c, p] = textscan (fid, formatstr, varargin)
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
54
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
55 ## Check input
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
56 if (nargin < 1)
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
57 print_usage ();
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
58 elseif (nargin == 1 || isempty (formatstr))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
59 formatstr = "%f";
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
60 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
61
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
62 if (nargin > 2 && isnumeric (varargin{1}))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
63 nlines = varargin{1};
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
64 args = varargin(2:end);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
65 else
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
66 nlines = Inf;
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
67 args = varargin;
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
68 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
69
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
70 if (! any (strcmpi (args, "emptyvalue")))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
71 ## Matlab returns NaNs for missing values
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
72 args{end+1} = "emptyvalue";
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
73 args{end+1} = NaN;
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
74 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
75
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
76 if (isa (fid, "double") && fid > 0 || ischar (fid))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
77 if (ischar (formatstr))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
78 if (ischar (fid))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
79 if (nargout == 2)
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
80 error ("textscan: cannot provide postion information for character input")
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
81 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
82 str = fid;
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
83 else
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
84 ## Maybe skip header lines
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
85 headerlines = find (strcmpi (args, "headerlines"), 1);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
86 if (! isempty (headerlines))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
87 fskipl (fid, headerlines);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
88 args(headerlines:headerlines+1) = [];
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
89 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
90 if (isfinite (nlines))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
91 str = "";
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
92 for n = 1:nlines
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
93 str = strcat (str, fgets (fid));
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
94 endfor
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
95 else
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
96 str = fread (fid, "char=>char").';
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
97 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
98 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
99
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
100 ## Determine the number of data fields
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
101 num_fields = numel (strfind (formatstr, "%")) - ...
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
102 numel (idx_star = strfind (formatstr, "%*"));
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
103
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
104 ## Call strread to make it do the real work
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
105 c = cell (1, num_fields);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
106 [c{:}] = strread (str, formatstr, args{:});
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
107
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
108 if (ischar (fid) && isfinite (nlines))
11191
01ddaedd6ad5 Reverse changeset b1f4bdc276b6. Use all lower case for "uniformoutput" option.
Rik <octave@nomad.inbox5.com>
parents: 11141
diff changeset
109 c = cellfun (@(x) x(1:nlines), c, "uniformoutput", false);
11141
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
110 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
111
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
112 if (nargout == 2)
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
113 p = ftell (fid);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
114 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
115
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
116 else
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
117 error ("textscan: second input must be a format specification");
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
118 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
119 else
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
120 error ("textscan: expecting first argument to be a file id or character string");
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
121 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
122
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
123 endfunction
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
124
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
125 %!test
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
126 %! str = "1, 2, 3, 4\n 5, , , 8\n 9, 10, 11, 12";
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
127 %! fmtstr = "%f %d %f %s";
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
128 %! c = textscan (str, fmtstr, 2, "delimiter", ",", "emptyvalue", -Inf);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
129 %! assert (isequal (c{1}, [1;5]))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
130 %! assert (length (c{1}), 2);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
131 %! assert (iscellstr (c{4}))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
132 %! assert (isequal (c{3}, [3; -Inf]))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
133
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
134 %!test
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
135 %! b = [10:10:100];
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
136 %! b = [b; 8*b/5];
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
137 %! str = sprintf ("%g miles/hr = %g kilometers/hr\n", b);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
138 %! fmt = "%f miles/hr = %f kilometers/hr";
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
139 %! c = textscan (str, fmt);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
140 %! assert (b(1,:)', c{1})
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
141 %! assert (b(2,:)', c{2})
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
142
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
143