--- dlmwrite.m.old 2005-11-28 23:14:51.719947000 -0500 +++ dlmwrite.m 2005-11-28 23:22:57.234779768 -0500 @@ -1,28 +1,67 @@ -## dlmwrite(file, matrix, 'option', value, ...) -## write matrix to the file using delimiters (defaults to ",") +## -*- texinfo -*- +## @deftypefn {Function File} {} dlmwrite(@var{file}, @var{A}) +## @deftypefnx {Function File} {} dmlwrite(@var{file}, @var{A}, @var{delim}, @var{r}, @var{c}) +## @deftypefnx {Function File} {} dmlwrite(@var{file}, @var{A}, @code{"attrib1"}, @var{value1}, @code{"attrib2"}, @var{value2}, ...) +## @deftypefnx {Function File} {} dmlwrite(@var{file}, @var{A}, @code{"-append"}, ...) +## +## Write the matrix @var{A} to the text @var{file} using delimiters. +## +## @table +## @item @var{delim} +## the delimiter to use to separate values on a row +## +## @item @var{r} +## the number of delimiter-only lines to add to the start of the file +## +## @item @var{c} +## the number of delimiters to prepend to each line of data. +## +## @item @code{"-append"} +## append to the end of the @var{file}. +## @end table +## +## @table +## @item attribute +## value +## +## @item append +## Either @code{"on"} or @code{"off"}. See @code{"-append"} above. +## +## @item delimiter +## See @var{delim} above. +## +## @item newline +## The character(s) to use to separate each row. Two special cases +## exist for this option. "unix" is changed into "\n", "pc" is +## changed into "\r\n", and "mac" is changed into "\r". Other +## values for this option are kept as is. +## +## @item roffset +## See @var{r} above. +## +## @item coffset +## See @var{c} above. +## +## @item precision +## The precision to use when writing the file. It can either be a +## format string (as used by fprintf) or a number of significant digits. +## @end table +## +## @example +## @var{A} = reshape(1:16,4,4); +## dlmwrite(@code{"file.csv"}, @var{A}) +## @end example +## +## Note the extra escaping of the backslashes necessary in using the +## latex delimiter of "\\" with a unix style newline. +## +## @example +## dlmwrite(@code{"file.tex"}, @var{A}, @code{"delimiter"}, @code{"&"}, @code{"newline"}, @code{"\\\\\n"}) +## @end example ## -## Use one of the following options: -## '-append' -## Add the data to an existing file. -## 'precision','%#.#f' -## Specify the width and number of decimals for the stored field -## Default is %.15g -## 'newline','os' -## Specify the line separator -## 'pc' uses -## 'unix' uses -## 'mac' uses -## 'delimiter','seq' -## Use 'seq' to separate elements of the matrix. Default is ','. Use -## the sequence "\t" for tab-delimited values. -## 'roffset',r -## The number of delimiter-only lines to add to the start of the output. -## 'coffset',c -## The number of delimiters to add to the start of each line. -## 'seq',r,c -## This is equivalent to 'delimiter','seq','roffest',r,'coffset',c. -## ## TODO: proper handling of complex data +## @seealso{dlmread, csvread, csvwrite, csv2cell, cell2csv} +## @end deftypefn ## Author: Paul Kienzle ## @@ -30,69 +69,77 @@ ## ## 2002-03-08 Paul Kienzle ## * Initial revision +## 2005-11-27 Bill Denney +## * Significant modifications of the input arguements for additional +## functionality. + +function dlmwrite (file, A, varargin) + if (nargin < 2) + usage("dlmwrite(file, A, delim, r, c)"); + endif -function [ ret ] = dlmwrite (file, A, varargin) - if nargin < 2, - usage("dlmwrite(file, A, 'option', value, ...)"); - end - - delim = ','; + ## set defaults + delim = ","; r = 0; c = 0; - mode = 'w'; - newline = setstr(10); - precision = '%.16g'; - - arg = 1; - n = length(varargin); - while arg <= n - code = varargin{arg++}; - if ~ischar(code), error("expects 'option',value,..."); endif - switch code, - case {'-append'}, - ## No value options - mode = 'a'; - - case {'delimiter','precision','roffset','coffset','newline'}, - ## One value options - if arg > n, error("'%s' expects a value",code); endif - value = varargin{arg++}; - switch code, - case 'delimiter', - if ~ischar(value), error("expects 'delimiter','seq'"); endif - delim = setstr(double(value(:))); - case 'precision', - if ~ischar(value) && ~any(value(:)=='%'), - error("expects 'precision','%#.#f'"); - endif - precision = value; - case 'newline', - switch value, - case 'pc', newline = setstr([13,10]); - case 'unix',newline = setstr(10); - case 'mac',newline = setstr(13); - otherwise, error("expects 'newline','pc'|'unix'|'mac'"); - end - case 'roffset', - if ~isscalar(value), error("expects 'roffset',r"); endif - r = value; - case 'coffset', - if ~isscalar(value), error("expects 'coffset',c"); endif - c = value; - end - - otherwise, - ## Two value options - if arg > n-1 || ~ischar(code) || ~isscalar(varargin{arg}) ... - || ~isscalar(varargin{arg+1}) - error("expects 'delimiter',r,c"); + newline = "\n"; + precision = "%.16g"; + opentype = "wt"; + + ## process the input arguements + i = 0; + while (i < length(varargin)) + i = i + 1; + if strcmpi(varargin{i}, "delimiter") + i = i + 1; + delim = varargin{i}; + elseif strcmpi(varargin{i}, "newline") + i = i + 1; + newline = varargin{i}; + if strcmpi(newline, "unix") + newline = "\n"; + elseif strcmpi(newline, "pc") + newline = "\r\n"; + elseif strcmpi(newline, "mac") + newline = "\r"; + endif + elseif strcmpi(varargin{i}, "roffset") + i = i + 1; + r = varargin{i}; + elseif strcmpi(varargin{i}, "coffset") + i = i + 1; + c = varargin{i}; + elseif strcmpi(varargin{i}, "precision") + i = i + 1; + precision = varargin{i}; + if (~ strcmpi(class(precision), "char")) + precision = sprintf("%.%gg", precision); + endif + elseif strcmpi(varargin{i}, "-append") + opentype = "at"; + elseif strcmpi(varargin{i}, "append") + i = i + 1; + if strcmpi(varargin{i}, "on") + opentype = "at"; + elseif strcmpi(varargin{i}, "off") + opentype = "wt"; + else + error("dlmwrite: append must be \"on\" or \"off\"."); endif - r = varargin{arg++}; - c = varargin{arg++}; - end - end + else + if (i == 1) + delim = varargin{i}; + elseif (i == 2) + r = varargin{i}; + elseif (i == 3) + c = varargin{i}; + else + usage("dlmwrite(file, A, delim, r, c)"); + endif + endif + endwhile - [fid,msg] = fopen(file,mode); + [fid,msg] = fopen(file,opentype); if (fid < 0) error(msg); else @@ -101,7 +148,7 @@ endif template = [ precision, repmat([delim,precision],1,columns(A)-1), newline ]; if (c > 0) - template = [ repmat(delim,1,c), template ]; + template = [ repmat(delim,1,c), template ]; endif fprintf(fid,template,A.'); fclose(fid);