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:
- doesn't add an EOL tag (LF or CR) after each row in
data
- 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?
Answer
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]
Comments
Post a Comment