Asked by Benjamin Lemmer
on 14 Feb 2019

I am having the problem that I want to save some data to a csv file.

The data I have in Matlab is something like this:

20190212114854371;517585652892199;20190212114852000;-2.3511062;4.999093;5.3438582;0.28869548;0.16085984;-0.57739097;52.27151;10.533472

You see, it is mixed int and float values. I want to store them exactly like this. However when I use dlmwrite without precision I end up with data like this:

2.019e+16;1.8509e+14;2.019e+16;-1.6664;6.3925;7.3933;0.0042612;0;0.0042612;52.274;10.527;0

which is not enough or it adds a lot of zeros, which slows down the writing process, if i use the needed precision:

20190211112837504.00000000;221480220621999.00000000;20190211112835000.00000000;-0.69032930;5.75713100;7.90648400;0.15009704;0.01083470;0.10411896;52.26511800;10.53640600;0.00000000

Is there a way to tell dlmwrite to onyl use precision if needed or is there another option to write csv data with precision ?

(Please do not be confused: I picked up different lines from the output.)

Answer by Walter Roberson
on 14 Feb 2019

Accepted Answer

No. dlmwrite only accepts one precision argument . That argument must be an integer (which is used as number of decimal places) or it must be ann fprintf format item describing aa single output value . It is valid to pass something like '%.12g' but there is no way to pass something conditional that says to use different format descriptions depending upon the value to be output (or the column number)

Furthermore inside matlab the values are not what you claim they are . There is no way to represent 0.1 exactly on floating point , only integer multiples of 2^(-N) for some integer N. Every one of the values you show with a decimal point has additional digits that you have not shown and matlab has no way of knowing whether those are wanted digits or not .

Walter Roberson
on 14 Feb 2019

That isn't the main problem. Look more closely at your data

-2.3511062;4.999093;5.3438582;0.28869548;0.16085984;-0.57739097;52.27151;10.533472

That is 8 significant digits, then 7, then 8, then 8, then 8, then 8, then 7, then 8. Number of digits after the decimal place is 7, 6, 7, 8, 8, 8, 5, 5.

You are inconsistent on what you output. However, what you output for the floating point numbers is consistent with what %.8g would output.

If you do create a table with a mix of int64 and double, then Yes, writetable will write the int64 in integer form. However, when you use writetable, you lose control over the number of digits of output you use. It might accidentally give you what you want in this test case, but you cannot count on it.

Benjamin Lemmer
on 16 Feb 2019

Too bad, it actually did not work. Do you have another idea how i could reach my goal ?

Stephen Cobeldick
on 17 Feb 2019

@Benjamin Lemmer: write your own file-writing function based on fopen, fprintf, and fclose.

If you import the timestamps as character than you avoid any loss of their data, and can easily print these to the output file directly using the %s format operator.

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 2 Comments

## Stephen Cobeldick (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/444953-how-to-use-precision-only-when-needed-with-dlmwrite#comment_671903

## Benjamin Lemmer (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/444953-how-to-use-precision-only-when-needed-with-dlmwrite#comment_671905

Sign in to comment.