annotate scripts/io/textscan.m @ 12575:d0b799dafede

Grammarcheck files for 3.4.1 release.
author Rik <octave@nomad.inbox5.com>
date Mon, 04 Apr 2011 15:33:46 -0700
parents b0084095098e
children f38cf6224452
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11523
fd0a3ac60b0e update copyright notices
John W. Eaton <jwe@octave.org>
parents: 11472
diff changeset
1 ## Copyright (C) 2010-2011 Ben Abbott <bpabbott@mac.com>
11141
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 -*-
11471
994e2a93a8e2 Use uppercase 'A' to refer to matrix inputs in m-files.
Rik <octave@nomad.inbox5.com>
parents: 11469
diff changeset
20 ## @deftypefn {Function File} {@var{C} =} textscan (@var{fid}, @var{format})
12575
d0b799dafede Grammarcheck files for 3.4.1 release.
Rik <octave@nomad.inbox5.com>
parents: 11589
diff changeset
21 ## @deftypefnx {Function File} {@var{C} =} textscan (@var{fid}, @var{format}, @var{n})
d0b799dafede Grammarcheck files for 3.4.1 release.
Rik <octave@nomad.inbox5.com>
parents: 11589
diff changeset
22 ## @deftypefnx {Function File} {@var{C} =} textscan (@var{fid}, @var{format}, @var{param}, @var{value}, @dots{})
d0b799dafede Grammarcheck files for 3.4.1 release.
Rik <octave@nomad.inbox5.com>
parents: 11589
diff changeset
23 ## @deftypefnx {Function File} {@var{C} =} textscan (@var{fid}, @var{format}, @var{n}, @var{param}, @var{value}, @dots{})
11471
994e2a93a8e2 Use uppercase 'A' to refer to matrix inputs in m-files.
Rik <octave@nomad.inbox5.com>
parents: 11469
diff changeset
24 ## @deftypefnx {Function File} {@var{C} =} textscan (@var{str}, @dots{})
994e2a93a8e2 Use uppercase 'A' to refer to matrix inputs in m-files.
Rik <octave@nomad.inbox5.com>
parents: 11469
diff changeset
25 ## @deftypefnx {Function File} {[@var{C}, @var{position}] =} textscan (@dots{})
11141
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
26 ## Read data from a text file.
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
27 ##
11563
3c6e8aaa9555 Grammarcheck m-files before 3.4 release.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
28 ## The file associated with @var{fid} is read and parsed according to
3c6e8aaa9555 Grammarcheck m-files before 3.4 release.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
29 ## @var{format}. The function behaves like @code{strread} except it works by
3c6e8aaa9555 Grammarcheck m-files before 3.4 release.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
30 ## parsing a file instead of a string. See the documentation of
3c6e8aaa9555 Grammarcheck m-files before 3.4 release.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
31 ## @code{strread} for details. In addition to the options supported by
3c6e8aaa9555 Grammarcheck m-files before 3.4 release.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
32 ## @code{strread}, this function supports one more:
11141
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
33 ## @itemize
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
34 ## @item "headerlines":
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
35 ## @end itemize
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
36 ## 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
37 ##
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
38 ## 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
39 ## the file, associated with @var{fid}.
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
40 ##
11471
994e2a93a8e2 Use uppercase 'A' to refer to matrix inputs in m-files.
Rik <octave@nomad.inbox5.com>
parents: 11469
diff changeset
41 ## The output, @var{C}, is a cell array whose length is given by the number
11141
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
42 ## of format specifiers.
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 second output, @var{position}, provides the position, in characters,
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
45 ## from the beginning of the file.
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 ## @seealso{dlmread, fscanf, load, strread, textread}
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
48 ## @end deftypefn
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
49
11471
994e2a93a8e2 Use uppercase 'A' to refer to matrix inputs in m-files.
Rik <octave@nomad.inbox5.com>
parents: 11469
diff changeset
50 function [C, p] = textscan (fid, format, varargin)
11141
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
51
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
52 ## Check input
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
53 if (nargin < 1)
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
54 print_usage ();
11469
c776f063fefe Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents: 11191
diff changeset
55 elseif (nargin == 1 || isempty (format))
c776f063fefe Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents: 11191
diff changeset
56 format = "%f";
11141
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
57 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
58
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
59 if (nargin > 2 && isnumeric (varargin{1}))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
60 nlines = varargin{1};
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
61 args = varargin(2:end);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
62 else
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
63 nlines = Inf;
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
64 args = varargin;
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
65 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
66
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
67 if (! any (strcmpi (args, "emptyvalue")))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
68 ## Matlab returns NaNs for missing values
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
69 args{end+1} = "emptyvalue";
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
70 args{end+1} = NaN;
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
71 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
72
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
73 if (isa (fid, "double") && fid > 0 || ischar (fid))
11469
c776f063fefe Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents: 11191
diff changeset
74 if (ischar (format))
11141
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
75 if (ischar (fid))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
76 if (nargout == 2)
11589
b0084095098e missing semicolons in script files
John W. Eaton <jwe@octave.org>
parents: 11563
diff changeset
77 error ("textscan: cannot provide position information for character input");
11141
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
78 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
79 str = fid;
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
80 else
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
81 ## Maybe skip header lines
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
82 headerlines = find (strcmpi (args, "headerlines"), 1);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
83 if (! isempty (headerlines))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
84 fskipl (fid, headerlines);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
85 args(headerlines:headerlines+1) = [];
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
86 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
87 if (isfinite (nlines))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
88 str = "";
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
89 for n = 1:nlines
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
90 str = strcat (str, fgets (fid));
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
91 endfor
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
92 else
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
93 str = fread (fid, "char=>char").';
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
94 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
95 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
96
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
97 ## Determine the number of data fields
11469
c776f063fefe Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents: 11191
diff changeset
98 num_fields = numel (strfind (format, "%")) - ...
c776f063fefe Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents: 11191
diff changeset
99 numel (idx_star = strfind (format, "%*"));
11141
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
100
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
101 ## Call strread to make it do the real work
11471
994e2a93a8e2 Use uppercase 'A' to refer to matrix inputs in m-files.
Rik <octave@nomad.inbox5.com>
parents: 11469
diff changeset
102 C = cell (1, num_fields);
994e2a93a8e2 Use uppercase 'A' to refer to matrix inputs in m-files.
Rik <octave@nomad.inbox5.com>
parents: 11469
diff changeset
103 [C{:}] = strread (str, format, args{:});
11141
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
104
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
105 if (ischar (fid) && isfinite (nlines))
11471
994e2a93a8e2 Use uppercase 'A' to refer to matrix inputs in m-files.
Rik <octave@nomad.inbox5.com>
parents: 11469
diff changeset
106 C = cellfun (@(x) x(1:nlines), C, "uniformoutput", false);
11141
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
107 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
108
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
109 if (nargout == 2)
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
110 p = ftell (fid);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
111 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
112
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
113 else
11472
1740012184f9 Use uppercase for variable names in error() strings to match Info documentation. Only m-files done.
Rik <octave@nomad.inbox5.com>
parents: 11471
diff changeset
114 error ("textscan: FORMAT must be a valid specification");
11141
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
115 endif
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
116 else
11472
1740012184f9 Use uppercase for variable names in error() strings to match Info documentation. Only m-files done.
Rik <octave@nomad.inbox5.com>
parents: 11471
diff changeset
117 error ("textscan: first argument must be a file id or character string");
11141
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
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
120 endfunction
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
121
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
122 %!test
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
123 %! 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
124 %! fmtstr = "%f %d %f %s";
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
125 %! c = textscan (str, fmtstr, 2, "delimiter", ",", "emptyvalue", -Inf);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
126 %! assert (isequal (c{1}, [1;5]))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
127 %! assert (length (c{1}), 2);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
128 %! assert (iscellstr (c{4}))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
129 %! assert (isequal (c{3}, [3; -Inf]))
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
130
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
131 %!test
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
132 %! b = [10:10:100];
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
133 %! b = [b; 8*b/5];
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
134 %! str = sprintf ("%g miles/hr = %g kilometers/hr\n", b);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
135 %! fmt = "%f miles/hr = %f kilometers/hr";
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
136 %! c = textscan (str, fmt);
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
137 %! assert (b(1,:)', c{1})
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
138 %! assert (b(2,:)', c{2})
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
139
224c80da37c5 textscan.m: Add new function.
Ben Abbott <bpabbott@mac.com>
parents:
diff changeset
140