# Formatting output of OpenAppend[] to match what Export[data,file,“.csv”] would output?

I have a large data set that gets exported to a .csv file. Export[data,filename,"csv"] is extremely fast and formats the data in a nice JMP-friendly manner. However, now I want to append to that file. OpenAppend[filename] works, but I can't get the formatting to match what Export[data,filename,"csv"] would output.

Specifically, I'm looking for E-notation on items that require it, each line is a row in data, comma-delimited, and no quotations around strings.

Example of what I want, and what Export[] returns:

1207-6,120113AC-1,Hall,1,B=1.25,T=27.8C,1,4,369.3213,8.857323e12,1908.02,0.9990578214405423,0.9816049084772898
1207-6,120113AC-1,Hall,1,B=1.25,T=27.8C,1,5,363.3738,8.925324e12,1924.474,0.9983476963774321,0.9706588849929922
1207-6,120113AC-1,Hall,1,B=1.25,T=27.8C,1,6,363.2613,8.906686e12,1929.098,0.9991256922330654,0.986551586345846


So far, I've come relatively close with some very convoluted, annoying workaround:

StringTrim[ StringReplace[ StringTrim[ StringReplace[ ToString[ NumberForm[exportdata, NumberFormat -> (SequenceForm[#1, If[#3 == "", "", "e" <> #3]] &)]], ", " -> ","], ("{" | "}")], "},{" -> "\r"], ("{" | "}")]

This returns an output in Mathematica, that looks almost correct (missing some digits, but those aren't significant anyway):

1208-5,120113AC-3,Hall,1,B=1.25,T=28.2C,1,4,360.304,8.75973e12,1977.56,0.999515,0.993529
1208-5,120113AC-3,Hall,1,B=1.25,T=28.2C,1,5,360.74,8.72497e12,1983.04,0.997762,0.962358
1208-5,120113AC-3,Hall,1,B=1.25,T=28.2C,1,6,359.863,8.72829e12,1987.11,0.999306,0.989313


as the output, but OpenAppend[], Write[] still:

1. doesn't add an EOL tag (LF or CR) after each row in data
2. adds quotes around the entire line (I'm assuming because it's technically a string)

To fix #1, I've put the Write[] inside a Do[] loop. Now the only issue is the quotation marks. How can I get rid of these?

Here's the code:

str = OpenAppend["Z:\\temp.csv", PageWidth -> [Infinity], NumberMarks -> False]
Do[Write[str, StringTrim[ StringReplace[ ToString[ NumberForm[exportdata[[i]],NumberFormat -> (SequenceForm[#1, If[#3 == "", "", "e" <> #3]] &)]], ", " -> ","], ("{" | "}")]], {i, Length[exportdata]}];
Close[str]


Or, am I doing everything in a completely ass-backwards way, and there's a super simple, easy, pretty way to append to an exported .csv file and I just haven't been able to find the way with all my searching?

-

As @WReach has noted, Export will accept a stream as its first argument so

file = OpenAppend["out.txt"]

Export[file, data, "CSV"];
WriteString[file, "\n"];

Close[file]


Alternatively you could first use ExportString to write the data into a string in the desired format, then send the string to the file to be appended to using WriteString.

Example:

data = RandomInteger[100, {100, 3}]

file = OpenAppend["out.txt"]

string = ExportString[data, "CSV"];

WriteString[file, string]
WriteString[file, "\n"];

Close[file]

-
Awesome, that's working wonderfully. I just had to add WriteString[str, "\n"] right before closing the file, so that the next append gets placed on the correct line. –  dthor Feb 23 '12 at 22:14
+1 Note that Export will accept a stream as its first argument, so one could write Export[stream, data, "CSV"] and avoid the temporary in-memory copy of the CSV string. –  WReach Feb 24 '12 at 18:42
@WReach I thought I had tried this in the past and didn't work. I was wrong. I updated the answer now. Thank you! –  Szabolcs Feb 24 '12 at 19:26