format data into string and write a txt file
15 次查看(过去 30 天)
显示 更早的评论
Hi,
I have the following cell,
a={[1E5 0 0 7.82E12 0]
[-1 0 0 -1 0]};
and I want to write a text file with the following format
1.0000000000000000E+05 0.0000000000000000E+00 0.0000000000000000E+00 7.8200000000000000E+12 0.0000000000000000E+00
-1.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 -1.0000000000000000E+00 0.0000000000000000E+00
As in two blank spaces at the beginning of the line if the first value is positive (line 1) and one blank space if it is negative (line 2), the "-" uses one space. There are also two blank spaces in between the values (if the value is negative the "-" uses one of those blank spaces).
First I tried converting a to a string cell:
for i=1:2
a{i}=num2str(a{i},'%.16e');
end
And I get this:
a =
2×1 cell array
{'1.0000000000000000e+050.0000000000000000e+000.0000000000000000e+007.8200000000000000e+120.0000000000000000e+00' }
{'-1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00-1.0000000000000000e+00 0.0000000000000000e+00'}
There are no blank spaces at all. Is it possible to specify the number of blank spaces in between the values?
Thank you,
0 个评论
采纳的回答
Stephen23
2018-10-25
编辑:Stephen23
2018-10-25
A cell array of numeric vectors is quite inconvenient to work with, so the first thing to do is convert it to a much easier to use numeric matrix:
a = {[1E5,0,0,7.82E12,0],[-1,0,0,-1,0]};
m = vertcat(a{:});
Method one: dlmwrite:
dlmwrite('sample.txt', m, 'delimiter',' ', 'precision','% .16E')
Method two: fprintf:
fmt = repmat(' % .16E',1,size(m,2));
fmt = [fmt(2:end),'\n'];
fprintf(fmt,m.')
prints this:
1.0000000000000000E+005 0.0000000000000000E+000 0.0000000000000000E+000 7.8200000000000000E+012 0.0000000000000000E+000
-1.0000000000000000E+000 0.0000000000000000E+000 0.0000000000000000E+000 -1.0000000000000000E+000 0.0000000000000000E+000
To write to a text file, add fopen and fclose:
[fid,msg] = fopen('sample.txt','wt');
assert(fid>=3,msg)
fprintf(fid,fmt,m.')
fclose(fid)
3 个评论
Stephen23
2018-10-25
编辑:Stephen23
2018-10-25
"Is there a way I can add one blank space at the beginning of each line in the text file? That is the only missing"
Of course, that is easy (I removed it, because it is missing from your example data shown on this page. This is why it is always better to upload a sample file, rather than relying on the markup of this page, which can change displayed characters). Use these:
Method one:
'precision',' % .16E'
Method two:
fmt = [repmat(' % .16E',1,size(m,2)),'\n'];
Take another look at your proposed solution:
fmt = [' ',fmt(2:end),'\n'];
The fmt char vector's first character was a space character (as defined inside the repmat), so why remove that space character, just to add another space character?
更多回答(1 个)
madhan ravi
2018-10-24
编辑:madhan ravi
2018-10-25
a={[1E5 0 0 7.82E12 0]
[-1 0 0 -1 0]};
dlmwrite('sample.txt',a,'delimiter','\t','precision','%0.16e')
8 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Characters and Strings 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!