Download this file

195 lines (177 with data), 6.7 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
function result= dlmread_mod(filename,delimiter,r,c,range)
%DLMREAD Read ASCII delimited file.
% RESULT = DLMREAD(FILENAME) reads numeric data from the ASCII
% delimited file FILENAME. The delimiter is inferred from the formatting
% of the file.
%
% RESULT = DLMREAD(FILENAME,DELIMITER) reads numeric data from the ASCII
% delimited file FILENAME using the delimiter DELIMITER. The result is
% returned in RESULT. Use '\t' to specify a tab.
%
% When a delimiter is inferred from the formatting of the file,
% consecutive whitespaces are treated as a single delimiter. By
% contrast, if a delimiter is specified by the DELIMITER input, any
% repeated delimiter character is treated as a separate delimiter.
%
% RESULT = DLMREAD(FILENAME,DELIMITER,R,C) reads data from the
% DELIMITER-delimited file FILENAME. R and C specify the row R and column
% C where the upper-left corner of the data lies in the file. R and C are
% zero-based so that R=0 and C=0 specifies the first value in the file.
%
% All data in the input file must be numeric. DLMREAD does not operate
% on files containing nonnumeric data, even if the specified rows and
% columns for the read contain numeric data only.
%
% RESULT = DLMREAD(FILENAME,DELIMITER,RANGE) reads the range specified
% by RANGE = [R1 C1 R2 C2] where (R1,C1) is the upper-left corner of
% the data to be read and (R2,C2) is the lower-right corner. RANGE
% can also be specified using spreadsheet notation as in RANGE = 'A1..B7'.
%
% DLMREAD fills empty delimited fields with zero. Data files where
% the lines end with a non-space delimiter will produce a result with
% an extra last column filled with zeros.
%
% See also DLMWRITE, TEXTSCAN, LOAD, FILEFORMATS.
% Obsolete syntax:
% RESULT= DLMREAD(FILENAME,DELIMITER,R,C,RANGE) reads only the range specified
% by RANGE = [R1 C1 R2 C2] where (R1,C1) is the upper-left corner of
% the data to be read and (R2,C2) is the lower-right corner. RANGE
% can also be specified using spreadsheet notation as in RANGE = 'A1..B7'.
% A warning will be generated if R,C or both don't match the upper
% left corner of the RANGE.
% Copyright 1984-2006 The MathWorks, Inc.
% $Revision: 5.40.4.13 $ $Date: 2006/10/02 16:32:30 $
% Validate input args
fid = -1;
if nargin==0
error('MATLAB:dlmread:Nargin','Not enough input arguments.');
end
% Get Filename
if ~ischar(filename)
error('MATLAB:dlmread:InvalidInputType','Filename must be a string.');
end
% Get Delimiter
if nargin==1 % Guess default delimiter
[fid message] = fopen(filename);
if fid < 0
error('MATLAB:dlmread:FileNotOpened',...
'The file ''%s'' could not be opened because: %s',filename,message);
end
str = fread(fid, 4096,'*char')';
frewind(fid);
delimiter = guessdelim(str);
if isspace(delimiter);
delimiter = '';
end
else
delimiter = sprintf(delimiter); % Interpret \t (if necessary)
end
if length(delimiter) > 1,
error('MATLAB:dlmread:InvalidDelimiter',...
'DELIMITER must be a single character.');
end
% Get row and column offsets
offset = 0;
if nargin<=2, % dlmread(file) or dlmread(file,dim)
r = 0;
c = 0;
nrows = -1; % Read all rows
range = [];
elseif nargin==3, % dlmread(file,delimiter,range)
if length(r)==1, % Catch obsolete syntax dlmread(file,delimiter,r)
warning('MATLAB:dlmread:ObsoleteSyntax',...
'Obsolete syntax. C must be specified with R.');
result= dlmread(filename,delimiter,r,0);
return
end
range = r;
if ischar(range)
range = str2rng(range);
end
r = range(1);
c = range(2);
nrows = range(3) - range(1) + 1;
elseif nargin==4, % dlmread(file,delimiter,r,c)
nrows = -1; % Read all rows
range = [];
elseif nargin==5, % obsolete syntax dlmread(file,delimiter,r,c,range)
if ischar(range)
range = str2rng(range);
end
rold = r; cold = c;
if r > range(3) || c > range(4), result= []; return, end
if r ~= range(1) || c ~= range(2)
warning('MATLAB:dlmread:InvalidRowsAndColumns',...
['R and C should match RANGE(1:2). Use DLMREAD(FILE,DELIMITER,RANGE)' ...
' instead.'])
offset = 1;
end
% For compatibility
r = max(range(1),r);
c = max(range(2),c);
nrows = range(3) - r + 1;
end
% attempt to open data file
if fid == -1
[fid message] = fopen(filename);
if fid < 0
error('MATLAB:dlmread:FileNotOpened',...
'The file ''%s'' could not be opened because: %s',filename,message);
end
end
% Read the file using textscan, modified from dlmread to read strings
try
if isempty(delimiter)
result = textscan(fid,'%s',nrows,'headerlines',r,'headercolumns',c,...
'returnonerror',0,'emptyvalue',0, 'CollectOutput', true);
else
delimiter = sprintf(delimiter);
whitespace = setdiff(sprintf(' \b\t'),delimiter);
result = textscan(fid,'%s',nrows,...
'delimiter',delimiter,'whitespace',whitespace, ...
'headerlines',r,'headercolumns',c,...
'returnonerror',0,'emptyvalue',0,'CollectOutput', true);
end
catch
fclose(fid);
rethrow(lasterror);
end
% close data file
fclose(fid);
result = result{1};
% textscan only trims leading columns, trailing columns may need clipping
if ~isempty(range)
ncols = range(4) - range(2) + 1;
% adjust ncols if necessary
if ncols ~= size(result,2)
result= result(:,1:ncols);
end
end
% num rows should be correct, textscan clips
if nrows > 0 && nrows ~= size(result,1)
error('Internal size mismatch')
end
% When passed in 5 args, we have an offset and a range. If the offset is
% not equal to the top left corner of the range the user wanted to read
% range Ai..Bj and start looking in that matrix at rold and cold. For
% backwards compatibility we create a result the same size as the specified
% range and place the data in the result at the requested offset.
% For example, given a file with [1 2 3; 4 5 6], reading A1..C2 with offset
% 1,2 produces this result:
% 0 0 0
% 0 5 6
if nargin==5 && offset
rowIndex = rold+1:rold+nrows;
columnIndex = cold+1:cold+ncols;
if rold == 0
rowIndex = rowIndex + 1;
end
if cold == 0
columnIndex = columnIndex + 1;
end
% assign into a new matrix of the desired size
% need to create temp matrix here cuz we want the
% offset region filled with zeros
new_result(rowIndex,columnIndex) = result;
result = new_result;
end