Write a well tabulated txt file

This is my code:
v_cutin=2.5;
v_cutout=15;
v_rated=5.5;
v=linspace(v_cutin,v_cutout,15);
omega_rpm=linspace(1,600,200);
dataset_lin=importdata('dataset_lin.mat');
dataset_red_lin=NaN*ones(((length(omega_rpm)/10)+1)*length(v)+length(v)-1,6);
x=1;
row=0;
y=1;
stop=0;
for i=1:length(dataset_lin)
if isnan(dataset_lin(i,1))==0
row=row+1;
stop=0;
elseif isnan(dataset_lin(i,1))==1 && stop<1
step=floor(row/10);
check=mod(row,10);
if check==0
dataset_red_lin(y:1:y+9,:)=compose("%.3f",dataset_lin(x:step:(i-1),:));
dataset_red_lin(y+10,:)=NaN*ones(1,6);
x=i+1;
row=0;
y=y+11;
elseif check>0
dataset_red_lin(y:1:y+10,:)=compose("%.3f",dataset_lin(x:step:(i-check),:));
dataset_red_lin(y+11,:)=NaN*ones(1,6);
x=i+1;
row=0;
y=y+12;
end
stop=stop+1;
elseif stop==1
i=length(dataset_lin);
end
end
A = dataset_red_lin;
C = num2cell(A);
idx = isnan(A);
C(idx) = {''};
writematrix(string(C), 'dataset_red_lin.txt', 'Delimiter', 'tab');
I need the conversion to cell in order to replace the NaN values with blank spaces. However, the resultant txt file is not well tabulated because there are some numbers which has no decimal digits. Ho do I can figure out the problem?

4 Comments

This looks very convoluted -- can you explain what you're doing here and illustrate with a small sample dataset just what is desired?
What do you expect/desire the output to be? if you want a specific output format, you have to write data in that format with fprintf or build the strings internally, but we need to know just what it is you want to be able to match that expectation.
There are some examples of writing formatted text files in the documentation for fprintf; most of the other output tools are, as you see here, free format.
I would like to obtain a txt file which has all the columns equally spaced. At the moment, my writematrix function gives me this kind of output (attached file) and, as you can see, there are some rows which are not aligned with the others
The code that I typed takes a matrix as input (dataset_lin.mat) which is composed of several submatrixes separated by NaN rows and with variable number of rows. For instance, the first submatrix occupies the rows 1 to 31, at row 32 I have a NaN row and from row 33 to 112 I have another submatrix and so far so forth. I have a total of 15 different submatrixes. The code takes this input matrix, for each submatrix store only 11 equally spaced rows. Afterthat, it converts the new shorter matrix containing submatrixes of equal dimension into cell arrays in order to replace the NaN rows with blank spaces. Finally, the final obtained matrix, with submatrixes of equal dimenion and separated by blank spaces, is written on a txt file. However, the resultant txt file does not have aligned colums...
Maybe try a fixed-width format containing enough digits for your data, in your calls to compose, e.g., compose("%9.3f",___)

Sign in to comment.

Answers (1)

DGM
DGM on 4 Dec 2021
Edited: DGM on 4 Dec 2021
As @Benjamin suggests, you can use fixed field widths in your output.
dataset_lin=importdata('dataset_lin.mat');
stepsize0 = 3; % initial row step size
blocksize = 11; % number of rows per output block
% find block extents
nanrows = find(all(isnan(dataset_lin),2));
nanrows(find(diff(nanrows)==1)+1) = [];
nanrows = [0; nanrows];
% process blockwise
fid = fopen('testfile.txt','w');
for b = 2:numel(nanrows)
thisblock = dataset_lin(nanrows(b-1)+1:stepsize0:nanrows(b)-1,:);
thisblock = thisblock(1:blocksize,:);
fprintf(fid,'%6.3f\t%8.3f\t%5.3f\t%5.3f\t%8.3f\t%7.3f\n',thisblock.');
fprintf(fid,'\n');
stepsize0 = stepsize0 + 1;
end
fclose(fid);

Categories

Asked:

on 4 Dec 2021

Edited:

DGM
on 4 Dec 2021

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!