Skip to main content

Run nb file and export each time in new line (of the same .xls file)


I have a problem that really limits my productivity. I need to run a script several times, export results in an .xls file. Instead of manually fullfilling my results in my .xls file, I thought about exporting my results in an excel file and just copy them. I know how to export my results each time in an excel file (this will overwrite my previous file each time, so I will have to copy results before rerunning script), I know how to automatically change the name of my exported file (receiving a unique ID so that I can then copy all of my exported files into my desired one), but the optimal solution would be to run my script, store results in an .xls file, and then rerunning it, having new values stored in previous files new line etc.


I tried many solutions found scatted in the web but nothing works, my exported file always remains in tacked, or gets corrupted (I tried PutAppend, Openwrite and other solutions, none of them worked , i guess I did something wrong).


Here is a dummy script:


x1=1;
f[x_] := PDF[PoissonDistribution[2.5], x];
myExportLine = {{"Text",x1, f[x1]}};


Export["Test_file.xls", myExportLine, "XLS"]

I need to provide values for my script manually (meaning I do not need to run any loop for my x1 values. Any idea how to implement it?


Example of fail attempt:


f1=OpenAppend["Test_file.xls"]

x2=2;
f[x_]:=PDF[PoissonDistribution[2.5],x];
myExportLine2={{"Text",x2,f[x2]}};
WriteString[f, myExportLine2, "\n"];

Close[f1];

edit: I corrected the repentance of f in two different variables. Renamed one of them into f1.



Answer



It is not possible to append to an Excel file. The only way is to read the data into memory, Append the additional data in-memory, the re-export the whole thing to disk. This is of course inefficient and it is up to you to decide if it is suitable for your use case.


I believe that the structure of Excel files is such that it isn't possible to append with software other than Mathematica either.


Alternatively, don't use Excel. Use a simple and predictable format like CSV:



Comments

Popular posts from this blog

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...

dynamic - How can I make a clickable ArrayPlot that returns input?

I would like to create a dynamic ArrayPlot so that the rectangles, when clicked, provide the input. Can I use ArrayPlot for this? Or is there something else I should have to use? Answer ArrayPlot is much more than just a simple array like Grid : it represents a ranged 2D dataset, and its visualization can be finetuned by options like DataReversed and DataRange . These features make it quite complicated to reproduce the same layout and order with Grid . Here I offer AnnotatedArrayPlot which comes in handy when your dataset is more than just a flat 2D array. The dynamic interface allows highlighting individual cells and possibly interacting with them. AnnotatedArrayPlot works the same way as ArrayPlot and accepts the same options plus Enabled , HighlightCoordinates , HighlightStyle and HighlightElementFunction . data = {{Missing["HasSomeMoreData"], GrayLevel[ 1], {RGBColor[0, 1, 1], RGBColor[0, 0, 1], GrayLevel[1]}, RGBColor[0, 1, 0]}, {GrayLevel[0], GrayLevel...

Is there a way to do conditional matrix loop using 'continue'

I have the following: n = 3; m = 5; ww = RandomReal[{0, 0.1}, {n, n}]; uu = RandomReal[{0, 1}, {m, n}]; pp = RandomReal[{0, 1}, {n, n}]; ss = RandomInteger[{0, 5}, {m, n}]; Grid[{{"ww", "uu", "pp", "ss"}, {ww // TableForm, uu // TableForm, pp // TableForm, ss // TableForm}}, Spacings -> {5, 2}, Dividers -> All] where I would like to look at every element of matrix ss and produce a matrix tt , with zeroes at the locations in ss which have zeroes, and in all other positions do the following: tt = (-1/Subscript[ww, m]) Log[(1 - uu)/(Subscript[pp, m - 1])], where Subscript[ww, m] is the value at index of ww matrix and where Subscript[pp, m - 1] is the value at index-1 of pp matrix. So for example if the first value ever read from matrix ss happens to be 2, then value taken from matrix ww would be from the row 2, but from pp would be from row 1. Also how to tell difference between a 0 as a valid value from within the matrix elemen...